2014-01-05 3 views
0

일부 정규 표현식을 작성하는 방법을 알아 내려고 지난 4 시간을 보냈지 만 얻을 수 있다고 생각할 때마다 내 테스트가 실패합니다 ... 아무도 도와 줄 수 없거나 나를 줄 수 있습니까? 올바른 길로 가야한다는 단서가 있습니까? 나는 내 앞에 치트 츠 시트가있다.올바른 정규식을 찾을 수 없습니다

다음을 원합니다. 정규식은 모든 단어에 ?이있는 문자열을 제공합니다.

예 : this is a? example sentence? to test the regex? 나는 결과로 a, sentenceregex을 원하는
.

최고의 정규식은 /\w\?/입니다.

+3

가장 좋은 것은 무엇입니까? –

+1

최고가// w \? /이 단 한 문자는? – user3156386

답변

4

에만 전적으로

\b[A-Za-z]+(?=\?) 

\bword boundary anchor 전체 단어가 일치되어 있는지 확인하게하고, (?=\?)lookahead assertion 질문이 있음을 주장 할 수있는 ASCII 문자로 구성되는 단어를 고려 본래의 정규식 그 물음표를 경기의 일부로 삼지 않고 바로 다음에 마크하십시오.

+1

두 번째'\ b'는 중복 됨 :) – HamZa

2

먼저 단어를 정의 할 수 있습니다. 단어를 정의하지 않았으므로 그 단어로 바꾸기 바란다. 예를 들어 좀 더 제한적인 문자 클래스로 바꾸면된다. ~ \w+ 또는 아마도 \b\S+\b 일 수도 있습니다.

여기에서 ?에 대한 확인을해야합니다. 이는 긍정적 인 미리보기 (?= ...)을 통해 수행 할 수 있습니다.

지금은 (?=\?)으로 시작할 수 있지만 정규 표현식에서 한 번에 한 위치 만 확인하면 ?이 단어의 시작 부분에 있다면 실용적이지 않습니다. 따라서 ? : (?=.*\?)을 찾기 전에 원하는 수의 문자 (0도 가능)를 허용해야합니다.

이제 .*\S*로 교체, 정규식에 적합하지 않은 단어를 가로 질러 갈 수 있습니다 :

\b(?=\S*\?)\S+ 

을 그리고 단어 \S보다 더 가지 않을 것이기 때문에 실제로 지난 \b을 삭제할 수 있습니다 .

$string = "this is a? example sentence? to test the regex?"; 

$output_array = array(); 
preg_match_all("/\b([a-zA-Z]*)\?/", $string, $output_array); 

print_r($output_array[1]); 

다음이 마지막에 ?없이 모든 경기를 반환으로

regex101 demo

+0

일치 그룹 없음 - 정규 표현식은 일치하는 데 적합하며 일관성이 있습니다 - 대괄호는 일치를 허용하도록 조정할 필요가 있습니다 (그러나 볼 수는 없습니다) –

+0

@ GrahamRitchie '?'가 단어의 아무 곳에 나있을 수 있다면 적어도 두 개의 캡처 그룹이 필요하며 정규 표현식을 수정할 수도 있습니다. 이 경우 결과에 대한 대체가'? '를 제거하는 것이 더 적절하다고 생각합니다. – Jerry

+0

유효한 포인트 - 나는 (내 정규식 당) 질문을 읽을 수 있을까요? 문장의 끝에서 - 당신 말이 맞아요 - 저는 사람들에게 정규 표현식을 모든 것에 대한 해결책으로 사용하는 것을 멈추라는 사람들에게 처음으로 말합니다 - 그리고 지금 저는 그것을하고 있습니다 - 우르! –

1

정규식입니다.

관련 문제