2016-12-27 1 views
2

을 캡처하지, 내가 문자열을 니펫을 "언어"어떤 종류의 캡처 고군분투하는 것은 포함메이크업 정규식 수술실 캡처 그룹 그래서

언어 조각은 () 안에있는 조합의 수 있습니다 En,Fr,De,Es,It

예 :

File (En,Fr,De,Es,It).doc <== should match all 5 languages 
File (En,Fr) (Required).doc <== should match `En` and `Fr` 
File (Enfoo,Fr).doc   <== should match only `Fr` 
File (E,Fr).doc    <== should match only `Fr` 

나의 현재 정규식 :

((\(|,)En(\)|,))|((\(|,)Fr(\)|,))|((\(|,)De(\)|,))|((\(|,)Es(\)|,))|((\(|,)It(\)|,))

그것은 무엇을 의미 하는가 :

다음
((\(|,) <== either starts with `open parenthesis` or `comma` (1) 
En  <== the language          (2) 
(\)|,)) <== either ends with `close parenthesis` or `comma` (3) 

난 그냥 정규식 OR에 추가 (|)

당신이 볼 수있는 문제 : regexr.com/3ev6p입니다 그것을 원 제 2 외국어 조각 즉 Fr가있는 경우 첫 번째 언어 스 니펫 En이 이미 open parenthesis 또는 comma을 캡처/점유하고 있기 때문에 제 2 언어 스 니펫 Fr이 일치하지 않기 때문에 정규 표현식 (1)을 만족하지 않습니다 ...

모든 언어 스 니펫을 완벽하게 처리하는 방법을 알고 계십니까? 나는이 모든 것을 얻기 위해 PHP의 preg_match_all()을 사용할 계획이다. 누군가가 도울 수 있기를 바랍니다. 감사합니다.

+1

내가 제대로 이해하고 있는지 확실하지 않지만 원하는 내용입니까? https://regex101.com/r/PAwqGg/1 – sinisake

+0

이 http://regexr.com/3ev6s은 어떻습니까? –

+1

@ Mi-Creativity, 모든 언어를 경계해야합니다. ;) – sinisake

답변

3

정규식은 언어 코드 주위에 쉼표를 사용합니다. 이는 일치 항목을 찾은 후 색인이 쉼표 뒤에오고 일치 할 수 없기 때문에 해당 쉼표 다음의 언어는 정규식 엔진에서 건너 뜁니다. 위해

는 일치의 lookarounds 중복 등이 사용될 수에 맞게 :

(?<=[(,])(En|Fr|De|Es|It)(?=[,)]) 
^^^^^^^^^    ^^^^^^^^ 

this regex demo를 참조하십시오.

(?<=[(,])는 언어 코드 전에 , 또는 (을 필요로하는 긍정적 인 lookbehind이며, (?=[,)])는 언어 코드의 오른쪽에 쉼표 나 )을 필요로하는 긍정적 예측이지만, 쉼표/​​괄호가 소모되지 않으며, 그것은 다음 반복 동안 일치되어야한다.

여기에서 가능한 또 다른 솔루션은 단어 경계를 사용하는 것입니다 (주석에 이미 설명되어 있음). 단어 경계는 전체 단어와 일치하는 데 도움이됩니다.

\b(En|Fr|De|Es|It)\b 

regex demo

+0

와우, 나는 '긍정적 인 표정'이나 '긍정적 인 표정'에 대해서도 모른다. 나는 학교를 건너 뛰지 말았어야했다. 추가 설명에 대한 답변으로 표시되었습니다. –

1

이 모두 일치해야합니다 참조 : preg_match_all 동반

(?<=,|\()(\w\w)(?=,|\)) 

이 작업을 수행해야합니다.

는 설명 :

  • lookbehind 주장 (","선행 또는해야 "(")
  • 두 단어 문자 (그래서 당신은 당신이 사전에 대상으로하는 언어를 지정할 필요가 없습니다) .
  • A는 앞서 주장)을 보면

(","또는 다음에해야한다 ")"그리고 이잖아. :)

Working version.

감사합니다.