정규식 옵션 문자를 일치시키는 방법


147

지금까지 올바르게 작동한다고 생각한 정규 표현식이 있습니다. 선택적인 캐릭터와 일치해야합니다. 있을 수도 있고 없을 수도 있습니다.

두 개의 줄이 있습니다. 상단 문자열은 일치하지만 하단 문자열은 일치하지 않습니다. 낮은 문자열에 단일 문자가 없으면 실패합니다.

거기에있는 경우 시작 5 자리 이후에 단일 문자를 얻고 싶습니다. 그렇지 않은 경우 나머지 문자열을 계속 얻습니다. 이 편지는 가능합니다 A-Z.

([A-Z]{1}) +.*? +정규식에서 제거 하면 문자를 제외하고 필요한 모든 항목과 일치하지만 중요합니다.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

여기에 내가 사용하는 정규식이 있습니다.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

답변:


246

사용하다

[A-Z]?

문자를 선택적으로 만들려면 {1}중복됩니다. (물론 [A-Z]{0,1}동일한 것을 의미하는 글 을 쓸 수도 있지만, 그것이 무엇인지에 대한 ?것입니다.)

정규식을 향상시킬 수 있습니다.

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

그리고 대부분의 정규식 방언에서 \d다음과 같습니다 [0-9].

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

그러나 11 개의 개별 캡처 그룹이 정말로 필요합니까? 그렇다면 네 번째에서 마지막 숫자 그룹을 캡쳐하지 않겠습니까?


팀, 나는이 정규식을 작성하지 않았으므로 솔직히 확신하지 못합니다. 나는 여전히 정규 표현식을 처음 접합니다. 이것을 작성하는 더 좋은 방법을 보게되면, 나는 제안에 열려 있습니다.
jim

1
Tim, 귀하의 예는 그 위치에 문자가 있는지 여부에 관계없이 두 문자열 모두에서 작동합니다. 감사.
jim

26

?다음과 같이 뒤에 하나를 추가하여 단일 문자를 선택적으로 만들 수 있습니다 .

([A-Z]{1}?)

수량 {1}자는 중복되므로 삭제할 수 있습니다.


감사합니다 codeaddict. 물음표가`+. *를 대신합니까? +`?
jim

grep regex를 사용할 때 {1}을 삭제하면 오류가 발생합니다 (grep : lookbehind assertion은 고정 길이가 아닙니다). 그래서 그것은 그것을 떠나는 경우입니다.
Zunderscore

6

단일 문자도 옵션으로 표시해야합니다.

([A-Z]{1})? +.*? +

또는 전체 부분을 선택적으로 만드십시오

(([A-Z]{1}) +.*? +)?

1
스테판, 그 편지를 전적으로 선택적으로 만들고 싶습니다. 나는이 두 가지를 모두 시도했지만 여전히 아무것도 일치하지 않습니다. 내가 잘못했다고 확신합니다. 문자열에 포함하도록 예제를 수정할 수 있습니까?
jim

0

원하는 (.*)\/(([^\?\n\r])*)위치 $2와 같은 경우에 맞게 설계된 더 간단한 정규식을 사용할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.