2016-11-07 1 views
2

나는이 포럼을 통해 검색 한하지만 내가 필요 정확히 않습니다 아무것도 찾을 수 없습니다를 발생.정규식 -에만 고유 한 문자열과 일치

이메일에 대한 데이터 손실 방지를하고 있지만 사람들이 여러 번 전자 메일에 회신 할 때 신용 카드 번호 나 계정 번호가 여러 번 나타나는 경우가 있습니다.

Java Regex에서 각 문자열을 한 번만 일치 시키려면 어떻게해야합니까?

예를 들어 다음 정규식을 사용하여 2 자와 일치하는 계정 번호를 찾은 다음 5 또는 6 숫자를 찾습니다. 두 경우 모두 CR을 생략합니다.

\b(?!CR)(?!cr)[A-Za-z]{2}[0-9]{5,6}\b 

우리는 어떻게 그것을 찾을 수 있습니다 :

CX12345 
CX14584 
JB145888 
JD748452 
CX12345 (Ignore as its already found it above) 
LM45855 

많은 감사를 사전에!

+0

마지막으로 일치하는 것이 좋습니다 : ['(? s) \ b ((! CR | cr) [A-Za-z] {2} \ d {5,6}) \ b (?!. * \ b \ 1 \ b)'] (https://regex101.com/r/ink9TO/1). Java에서는 이중 백 슬래시를 사용하는 것을 잊지 마십시오. –

+0

안녕하세요. 도움을 제공해 주셔서 감사합니다. 나는이 문자열을 Regex 테스터에 추가하려고 시도했지만 그 시작은 (? s)를 처음부터 좋아하지 않는다는 것을 되 돌리는가? 또한, 그것에서 (? s)을 제거하려고 할 때, 그것은 여전히 ​​이전에했던 일을합니다. 같은 문자열의 여러 일치. 어떤 아이디어라도 제발? 도구를 사용하여 테스트하려면 www입니다.regextester.com 자바 스크립트를 사용하여. 감사합니다 – Chosenv3

+0

왜 "정규식 검사기"? Java 코드에서 사용하십시오. 나는 이미 온라인 테스터에서 테스트를 내 의견에 제공했습니다. 자바에서는'String pattern = "(? s) \\ b ((?! CR | cr) [A-Za-z] {2} \\ d {5,6}) \\ b (? * \\ b \\ 1 \\ b) ";". [** Java 데모 **] (http://ideone.com/7IihtV). –

답변

0

을 :

예를 들어,
/\b((?!CR|cr)[A-Za-z]{2}\d{5,6})\b(?![\s\S]*\b\1\b)/ 

regex demo is available here

DETA ILS :

  • \b - 선도적 인 단어 경계
  • ((?!CR|cr)[A-Za-z]{2}\d{5,6}) - 그룹 1 캡처
    • (?!CR|cr) - 다음 두 문자가 CR 또는 cr의 부정적 예측 검사가 될 수 없습니다
    • [A-Za-z]{2}-2 ASCII 문자
    • \d{5,6} - 5 - 6 자리
  • \b - 단어 경계 후행
  • (?![\s\S]*\b\1\b) - ([\s\S]*)의 그룹 (1)에 캡쳐 된 단어 경계 (\b)와 동일한 값이어서 임의 0+ 문자가 존재하는 경우와 (일치 실패 네거티브 룩어 \1 역 참조) 및 후미 단어 경계.
+0

우수한,이 나를 위해 일했습니다! 이걸 도와 줘서 고마워. – Chosenv3

1

나는 당신이 만나는 문자열의 집계를 유지하기 위해 여기에 어떤 종류의 Map을 사용합니다.

String ccNumber = "CX12345"; 
Map<String, Boolean> ccMap = new HashMap<>(); 

if (ccNumber.matches("^(?!CR)(?!cr)[A-Za-z]{2}[0-9]{5,6}$")) { 
    ccMap.put(ccNumber, null); 
} 

그런 다음 당신의 정규식 패턴과 일치하는 고유의 신용 카드 번호를 얻을 수있는 맵의 키 집합을 반복 : 당신은이 같은 정규식을 필요로하는 것

for (String key : map.keySet()) { 
    System.out.println("Found a matching credit card: " + key); 
} 
+0

안녕하십니까, 응답 해 주셔서 감사합니다. 그러나 이것이 우리의 이메일 클라이언트에서 작동하는지 확실하지 않습니다. 나는 오직 하나의 기본 문자열을 찾을 수 있다고 생각합니다. 그러나 나는 이것을 시도 할 것이다. – Chosenv3

+0

'if (ccNumber.matches ("^ (?! CR) (?! cr) [A-Za-z] {2} [0-9] {5,6} $"))'='if (ccNumber (ccNumber.matches ("^ (?! CR) (A-Za-z) {2} [0-9] {5,6}") ! CR | cr) [A-Za-z] {2} [0-9] {5,6} "))'패턴을 만나는 전체 sttring 만 일치시킵니다. –

+0

@ WiktorStribiżew OP가 문자열 집합을 파싱하여 각 문자열이 일치하는지 알고 싶다고 가정합니다. –