2010-07-25 2 views
5

긴 텍스트 문자열이 있다고 가정하면 대괄호 안에 this이라는 단어가 나타날 때마다 캡처하고 싶습니다. 내가 어떻게 할 수 있니? 을 ODIO (Regex는 두 구분 기호 내에서 단어가 나타날 때마다 캡처합니다.

Etiam의 scelerisque, NUNC AC egestas consequat 다음 텍스트에 상기 패턴을 이용하여, 예를 들어

/\(.*(this).*\)/g 

다음 패턴은 이후 모든 경우를 무시하고, 제 this 일치 이 님의 질문에 답변이 정확하지 않습니다. this nisi. Aliquam erat volutpat).

odio 뒤에 첫 번째 this 만 반환합니다.

내가 뭘 잘못하고 있니?

+0

에 이것을 시도 –

+0

좋아, 샘플 텍스트에 "this"가 3 개 있습니다. 그래서 예상되는 결과는 무엇입니까 ?? 이 괄호 안에 "this"의 수를 계산 하시겠습니까? 또는 그 괄호 사이에있는 것이 무엇이든지 반환하고 싶습니까? 출력으로 원하는 것을 명확하게 설명하십시오 – ghostdog74

+0

+1 propter uti lingua latina. :) – danlei

답변

6

첫째로, 욕심을 먹지 마라. 당신은 '이'의 발생 수를 계산하는 것을 목표로하는 경우

/\(.*?(this).*?\)/g

둘째, 정규식은 아마 여기에 올바른 도구가 아닙니다. 문제는 첫 번째 'this'가 닫혀 있는지 확인하기 위해 닫는 구분 기호와 일치해야한다는 것입니다. 즉, 정규식을 계속 적용하면 이미 사용 된 구분 기호 집합 내부의 항목과 일치하지 않습니다.

내가 좋아하는 일을 잡을 것 이상 가지고있는 정규 표현식 (단지 구분의 각 세트에 대해 한 번, 두 번 일치)

foo (baz this bar) (foo this)

하지만하지 :

foo (this this bar) baz (this this this)

시도를 정규식 대신 간단한 단일 패스 스캐너를 사용합니다. 또 다른 방법은 두 개의 정규식을 사용하는 것입니다. 하나는 문자열을 둘러싸 기 섹션과 닫히지 않은 섹션으로 구분하고, 다른 하나는 닫힌 영역 내에서 검색하는 것입니다.

1

.*의 사용은 검색 문자열의 모든 단일 문자와 일치합니다. 그래서 실제로 여기서 뭘하고있는 것은 괄호 안에 처음 발견 된 this의 앞뒤에 모든 것을 매치시키는 것입니다. 현재 경기 결과는 아마 조금 다음과 같이 : 배열의 첫 번째 항목은 다음과 전체 표현식이 일치하는 하위 문자열 및 전부입니다

["(odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat)", "this"] 

는 정규식의 캡처 된 값입니다.당신은 괄호 안의 this의 모든 발생을 일치 시키려면

, 하나 개의 솔루션 먼저 괄호 안의 모든 것을 문자열을 얻을 것이다, 그 문자열에 this 검색 :

# Match everything inside the parentheses 
/\([^\)]*\)/ 

# Match all occurrences of the word 'this' inside a substring 
/this/g 
0

을 내가 구현 다음 정규식을 사용하여 모든 영문자를 포함하는 정규식 :

# cat testfile 
aabc a1 +++ xyz 20 30 =40 -r 
# cat testfile | sed -e "s/\([[:alnum:]]\{1,\}\)/<pre>\1<post>/g" 
<pre>aabc<post> <pre>a1<post> +++ <pre>xyz<post> <pre>20<post> <pre>30<post> =<pre>40<post> -<pre>r<post> 
# 

희망이 있습니다.

0

나를 위해 위의 작품 (이)

문자열, 당신은 그것을 사용하는 코드를 게시 ... 내가 그 패턴을 잘못 아무것도 표시되지 않습니다, 액면 http://regex101.com