: 하나 ([a-zA-Z]+)(\d+)([a-zA-Z]+)
그런 다음 각 그룹에 얼마나 많은 편지 확인할 수 있습니다 다음 부분을 첫 글자 다음에 입력하고, lookbehind를 사용하여 입력의 이전 부분을 확인합니다. 예를 들어
:
// |first letters (1 to 3)
// | if 3 letters precede...
// | digits (1 to 7)
// | if 7 digits precede...
// | 3 letters
Pattern p = Pattern.compile("[a-zA-Z]{1,3}((?<=[a-zA-Z]{3})\\d{1,7})?((?<=\\d{7})[a-zA-Z]{3})?");
String[] inputs = {"XYZ0001112CCC", "A", "AB", "ABC", "ABC12", "ABC123", "A1", "AB2", "ABCD123","ABC1234567XY1"};
Matcher m;
for (String input: inputs) {
m = p.matcher(input);
System.out.println("Input: " + input + " --> Matches? " + m.matches());
}
출력 :
Input: XYZ0001112CCC --> Matches? true
Input: A --> Matches? true
Input: AB --> Matches? true
Input: ABC --> Matches? true
Input: ABC12 --> Matches? true
Input: ABC123 --> Matches? true
Input: A1 --> Matches? false
Input: AB2 --> Matches? false
Input: ABCD123 --> Matches? false
Input: ABC1234567XY1 --> Matches? false
주
\\w
도 자리 유효성을 검사하기 때문에 나는 문자 클래스 [a-zA-Z]
에 \\w
표현을 변경했습니다. [a-zA-Z]
에 대안은 다음과 같습니다
내 Pattern
는 3 문자 그룹으로 마지막 편지를 취
최종 메모 플래그 Pattern.CASE_INSENSITIVE
와 함께. 1 ~ 2 자까지 입력 할 수있는 경우 마지막 한정자 식 {3}
을 {1,3}
으로 변경하면됩니다.형식이 오히려 쉽기 때문에
왜 ABC12 또는 ABC123이 false를 반환합니까? –
@Tim my bad, 나는 첫 번째 3 글자 다음의 전체 입력에 대해 "한 번 또는 전혀"한정 기호를 사용했습니다. 결정된. – Mena
감사합니다. @ 메나. 지금은 괜찮아 보인다. 나는 정규식에 익숙하지 않다. 하지만 당신은 그런 상황에 대한 정규 표현을 제안합니까? 작동하지만 성능에 대한 고려 사항도 있습니다. 이것은 정규식 사용에 편리한 상황입니까? –