2014-10-19 4 views
0

내가 플레이하는 머드에서 몹 룸 설명은 다양한 변형으로 시작할 수 있습니다. 나는 가능한 오직 시작 플래그 중 하나가 아니라 군중의 방 설명 만 캡처하는 정규 표현식을 작성하려고합니다. 이것은 내가 지금까지 가지고있는 것입니다 :정규 표현식 패턴 완성하기

^\((?:[ACDGHIXRSTUW()]+|\s?\(Angry\))\)?\s?(.*)$ 

폭도가 시작 플래그를 갖지 않을 때까지 작동합니다. 다음은 유사 콘텐츠에 대한 예입니다.

(H) (Angry) A mob is here. 
(A)(W)(R) A mob is also here. 
Another mob is here. 

이는 폭도가 나타날 수있는 세 가지 방법입니다. 기본적으로 범위 부분의 모든 문자는()로 둘러싸인 플래그가 될 수 있습니다. 단일 문자 플래그에는 공백이 없음) 다음에 공백이 없습니다. (단, Angry) 앞에는 공백이 있습니다.

문제점은 마지막 mob를 캡처하지 않고 캡쳐하고 있다는 것입니다. "(Angry)"첫 번째 군중에서. 나는 정규식에 대한 공정한 이해를 일반적으로 가지고 있다고 생각하지만, 내가 잘못하고있는 것을 볼 수는 없으며, 심지어 그것을 처리하는 가장 효율적인 방법이 아닐 수도있다.

편집 : 명확하지 않은 경우 마지막 이후의 모든 항목을 캡처하거나 플래그가없는 경우 처음부터 캡처하고 싶습니다.

답변

2

이 방법이 유용합니까?

^(?:.*\))?(.*) 
+0

명령은 '^ 경우 더 나은 것 (? :. * \)) (?. *)') –

+0

사실, 원래는 hwnd의 대답을 보았지만 Avinash Raj의 버전 (작은 수정 포함)이 더 잘 작동합니다! 다시 한 번 감사드립니다! – Josh

+0

@AvinashRaj 좋은 지적. 감사. –

1

다음 정규 표현식을 사용할 수 있습니다.

^(?>.*\))?\s*(.*) 
+0

당신이 일하면서 새로운 줄 $이 마음에 들지 않는 것 같아서 다음 줄에 피가났습니다. 그것을 일으키는 원인을 모르지만, 이것은 미래의 정규 표현식에 실제로 도움이되었습니다! – Josh

+0

이유가 확실하지 않은 이유, http://regex101.com/r/mR5uM3/2 – hwnd

1

또는이 패턴
\s*([^)]+$)을 사용하거나 멀티 라인 입력에 \s*([^)\r\n]+$)
Demo

\s*      whitespace (0 or more times) 
(      group capture 
    [^)]+     any character except: ')' (1 or more times) 
    $      before an optional \n, and the end of the string 
)      end of group