2014-04-04 2 views
1

"foo"및 "bar"와 일치하도록 Regex를 원하지만 "foo"또는 "bar"가 "a", "an"또는 " ".Regex에서 토큰을 버리기 전에

foobar은 문자열의 시작 또는 끝 부분에있을 수 있습니다.

예는 일치하지 :

"end of Foo." [1 Match: Foo] 
"end of bar." [1 Match: bar] 
"The foo and bar" [1 Match: bar] 
"foo bar" [2 Matches: foo, bar] 

예에는 일치 : 나는 부정적인 lookbehind을 할 수 있습니다 생각

"foobar" 
"foofoo" 
"the foo" 
"a bar" 
"andbar" 
"the foo goes to a bar." 

? 그렇다면 JS와의 이식성에 대한 부정적인 견해로 전환 될 수 있습니까?

나는

/(\bfoo\b|\bbar\b)(?!the|a(n)?)/igm

을 시도했지만이 작동하지 않습니다.

감사합니다.

답변

1

방법은 테스트하는 각 문자열에 대한 캡처 그룹의 존재 여부를 테스트하는 것으로 구성됩니다. 패턴은 피하기를 원하는 경우도 포함해야합니다 (문자열의이 부분을 건너 뜁니다). 캡처 그룹에 허용 된 사례가 포함되어 있습니다. 예 :

/\b(?:(?:the |an?)(?:foo|bar)|(foo|bar))\b/gi 

예 :

var re = /\b(?:(?:the |an?)(?:foo|bar)|(foo|bar))\b/gi; 
var str = "the foo a bar FoO BAr"; 
var myArray; 
var result = Array(); 
while ((myArray = re.exec(str)) !== null) { 
    if (myArray[1]) { // <- test if the capture group is defined 
     result.push(myArray[1]); 
    } 
} 

console.log(result); 
+0

하지만이 있습니다
Regular expression visualization

자바 스크립트는 그 다음이다 빈 캡처? 나는 이것이 온라인 파서에서 어떻게 매치되는지 약간 혼란 스럽다. http://regexr.com/38lkg :) – kjhf

+0

@kjhf : 온라인 정규식 검사기는 패턴이 foo 또는 bar가 포함 된 모든 문자열과 일치하므로이를 테스트하기위한 좋은 도구는 아닙니다. 코드 예제를 테스트하는 것이 좋습니다. –

+1

@kjhf : 하나의 정규식으로 작업을 수행 할 수 있지만 pcre 또는 perl과 같은 고급 정규식 엔진이 필요합니다. –

2

당신은 쉽게 철자를 거꾸로 단어를 일치 일치하기 전에 문자열의 문자 순서를 반대로하는 정규식을 작성 찾을 수 있습니다. 그러면 Negative Look Ahead을 사용하여 Negative Look Behind을 시뮬레이션 할 수 있습니다.

그래서 반전 단어 정규식은 다음과 같습니다

/\b(?:oof|rab)\b(?!eht|n?a)/igm 

시각화 : 그래서 글이 일치하지

function ReverseString(str) { 
    return str.split("").reverse().join(""); 
} 

var myRegex = /\b(?:oof|rab)\b(?!eht|n?a)/igm; 
var myString = "This is foo possibly"; 

alert(ReverseString(myString).match(myRegex)); 
+0

좋은 생각인데'the'와'foo' 사이에 공백이 있다는 것을 잊지 마십시오. –

+0

하하, 좋은 올린 사람 JS 좋은 생각. 저는 실제로 C#을 작성하고 있습니다. JS는 번역이 필요한 미래의 이식성을위한 것입니다. 따라서 내가 태그에서 언어를 제외시킨 이유는 무엇입니까? C#의 유니 코드 지원을 통해 역순으로 사용할 수 있다고 생각합니다. [http://stackoverflow.com/questions/228038/best-way-to-reverse-a-string]! – kjhf

+1

당신은 C#에서 네거티브 룩 배후를 지원하는 C#에서 사용할 수있는 좀 더 완벽한 Regex 구현물을 가져야합니다. 그래서 정규 표현식을 C#으로 작성한 다음 JavaScript로 이식 할 때 역 방법을 사용합니다. – AeroX