2012-12-06 2 views
0

첫 번째 발생에서 멈추는 정규 표현식을 만들려고합니다. 나는 그것을 욕심이없는 것으로 만들 수 있다는 것을 알고있다. ?. 여기처음에 정규 표현식을 멈추는 방법 (욕심쟁이를 피하기 위해) 문구 전체에서

"This is sample text located at first line and located at second line." 

을 나는 pattern2를 사용 pattern1을 찾고 있어요 :

문자열을 고려하십시오.

  • pattern1"text"
  • pattern2입니다 "located at" 위의 문자열에서

, 나는 "text"을 추출 할, 그리고 내 검색 패턴은 "located at", 그래서 나는 다음과 같은 정규식 사용하고 있습니다 :

/is.*sample(.*)located at?/ 

어떻게 만들 수 있습니까? located at 비 욕심쟁이? 내 정규식을 확인하려면 http://rubular.com/을 사용하고 있습니다.

+1

'test'가'text'이어야하는 경우에도 'test'다음에'sample'을 찾고 싶기 때문에 정규 입력은 예제 입력에서 작동하지 않습니다. 그리고'? '를 사용하여 무언가를 무언가로 만들고 싶다면'. *?'와 같이 한정 기호 다음에'? '를 써야합니다.rubular를 링크하지 않고 Rubular에 대한 실제 테스트 예제 (페이지 하단의'make permalink'를 클릭하십시오.) –

+0

@ m.buettner @ m.buettner 실수로 유감스럽게 생각합니다. http://rubular.com/r/LB1ESohvuK –

답변

2

정규식이 올바르지 않습니다. 첫 번째 "에있는"이전에 발생 한 "단어를"원하는 경우

, 당신은 사용할 수 있습니다 : 나는 공백이 아닌 문자가 \S를 사용하여 의미하는 "단어"를 정의하고 있습니다

"This is sample text located at first line and located at second line."[/(\S+)\s+located at/, 1] 
=> "text" 

, 그래서 구두점과 숫자가 알파 문자에 포함됩니다. [A-Za-z0-9_]을 원하면 \w과 같은 다른 클래스를 사용할 수 있습니다. 그렇지 않으면 같은 [a-z]를 사용

"This is sample text located at first line and located at second line."[/([a-z]+)\s+located at/i, 1] 
=> "text" 

당신은 "샘플"과 먼저, 당신이 사용할 수있는 "에있는"사이에 발생하는 모든 텍스트하려면 다음

"This is sample text located at first line and located at second line."[/sample\s+(.+?)\s+located at/, 1] 
=> "text" 

당신의 패턴 /test.*sample(.*)located at?/에서, 당신은 것을 0보다 많거나 더 많은 것을 의미하는 복수 .*을 사용합니다 (그러나 실제로는 컨텍스트에 따라 다르지 않지만 지금 당장 필요 이상으로 중요합니다). 욕심 때문에 "더 많이"당신이 충돌하고있는 부분입니다. 그리고, 당신이 그것을 두 번 사용하기 때문에, 그것은 두 배로 욕심이납니다. ?을 추가하여 "비 탐욕스러운"변형을 사용할 수는 있지만 정규식 엔진에 너무 많은 로프를 가지고 있기 때문에 여전히 올바르게 작동하지 않습니다. 내 패턴은 모든 것을 강화하여 처음 두 개에서 ? 수정자를 사용할 필요성을 줄입니다.

제 3의 예는 다시 .+이 욕심을 먹었을 것이므로 중재해야했습니다.

마지막으로, 패턴 at?.*을 수정 ? 적용되지 않으며,이 일에 엔진을 일으키는 원인이되는 선행하는 t에 작용하는 것하지 않은, "제로 또는-한 't'를 찾을 수 있어야합니다" 그것이 "a"또는 "at"와 일치하기 때문에 원하는 것을 선택하십시오.