2013-07-12 3 views
0
나는 나에게 다음과 같은 규칙에 맞게 문자열을 찾는 데 도움이됩니다 매우 구체적인 정규식 표현을 검색하고

:정규식을

  1. 문자열 키워드 '올해를 포함해야합니다 '또는'YEAR '
  2. 키워드는 문자가 아닌 다른 텍스트와 구분되어야합니다. 그렇지 않으면 키워드는 모두 대문자 또는 대문자가 혼합 된 문자열로 대문자가 사용됩니다.
  3. 키워드는 문자열의 시작 또는 끝에 있어야합니다.

    Order YEAR 
    OrderYear 
    Order_YEAR 
    ORDER_YEAR 
    order year 
    YEAR_Order 
    YearOrder 
    

    하지만이 :

예를 들어, 나는 다음과 같은 문자열을 일치하도록 정규식 싶습니다

orderyear 
ORDERYEAR 
yearning 
Order_Year_Test 

내가 지금까지 가지고 올 수있는 유일한 방법 :

^YEAR|YEAR$|^Year|Year$ 

대부분의 경우 작동하지만 "주문 연도"및 "주문"예제의 반대 출력. 대소 문자 규칙을 표현하는 일종의 정규 표현식이 필요합니다.

특히 ICU의 regex 라이브러리를 사용하고 있습니다 (단, 일반 정규식 조언은 괜찮습니다). 어떤 도움

감사합니다,

답변

1

설명

이 표현됩니다 원하지 않는 경우를 피하면서

  • 일치하는 모든 샘플의 경우는
  • 는 자바 정규식 엔진을 준수

참고로을 사용합니다. 식에 공백과 주석을 무시옵션

(?:^|\s)(?:Year|YEAR)(?:\s|\Z|$) # match no prefix or suffix 
| 
(?:^|\s)[A-Z][a-z]+[^a-zA-Z\d]?(?:Year|YEAR)(?:\s|\Z|$) # match title case prefix 
| 
(?:^|\s)[A-Z]+[^a-zA-Z\d\s](?:Year|YEAR)(?:\s|\Z|$) # match all uppercase prefix 
| 
(?:^|\s)[a-z]+[^a-zA-Z\d](?:year)(?:\s|\Z|$) # match all lower case prefix and keyword 

| 
(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d]?[A-Z][a-z]+(?:\s|\Z|$) # match title case suffix 
| 
(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d\s][A-Z]+(?:\s|\Z|$) # match all uppercase suffix 

또는 하나의 문자열로

: (?:^|\s)(?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[A-Z][a-z]+[^a-zA-Z\d]?(?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[A-Z]+[^a-zA-Z\d\s](?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[a-z]+[^a-zA-Z\d](?:year)(?:\s|\Z|$)|(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d]?[A-Z][a-z]+(?:\s|\Z|$)|(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d\s][A-Z]+(?:\s|\Z|$)

라이브 예 : http://www.rubular.com/r/QTUNDPKuOL

샘플 텍스트

Order YEAR 
OrderYear 
Order_YEAR 
ORDER_YEAR 
order year 
YEAR_Order 
YearOrder 
But not these: 

orderyear 
ORDERYEAR 
yearning 
Order_Year_Test 

[0] => Order YEAR 
[1] => 
OrderYear 
[2] => 
Order_YEAR 
[3] => 
ORDER_YEAR 
[4] => 
order year 
[5] => 
YEAR_Order 
[6] => 
YearOrder 
에 일치