2009-02-09 6 views
2

정규식으로 어떻게합니까?정규식 문제 내가 알아낼 수 없다 (부정적인 lookbehind)

내가이 문자열과 일치 할 : -myString

을하지만 난이 문자열의 -myString 일치하지 않습니다 --myString

mystring에 물론 아무것도이다.

심지어 가능합니까?

편집 : -string1, --string2

:

string to match: 
some random stuff here -string1, --string2, other stuff here 
regex: 
(-)([\w])* 

이 정규식은 나에게 3 일치를 반환

여기에 지금까지 내가 질문을 게시 한 이후 무엇을 가지고있는 좀 더 정보가 있어요

이상적으로는 나를 돌려 보내고 싶습니다. -string1 일치

+0

BTW-이 좋은 재미 있고 대답은 유익한,하지만 정규식 옵션 처리 (내가 용의자가 올바른 도구가되지 않을 수도 있습니다 당신이 무엇을하려고하는지) – dmckee

+0

만약 내가 정규식으로 할 수 없다면 다르게 할거야. 그 이유는 그게 가능한지 알고 싶었어요 :) –

+0

나는 당신이 그것을 할 수 있다고 확신합니다. 그것이 최선의 방법 일뿐입니다. 그러나이 방법을 알고 FSM lexxing을 모르거나 용인 할 수없는 성능이나 유지 보수 문제가 없다면 저를 무시하십시오. 건배. – dmckee

답변

11

가정 정규식 엔진 지지부 (네거티브) lookbehind :

/(?<!-)-myString/ 

Perl 않습니다, 자바 스크립트, f 또는 예입니다. 마지막 편집을 기반으로

+0

내 regex 컴퓨터는 .Net에있는 컴퓨터입니다. 지원한다면 단서가 없습니다. –

+0

있습니다. "(? Tomalak

+0

Tomalak, 네, 그게 내가 필요한 것입니다. 그걸 내가 답으로 표시하면 받아 들일 수 있니? –

0
/^[^-]*-myString/ 

테스트 :

[~]$ echo -myString | egrep -e '^[^-]*-myString' 
-myString 
[~]$ echo --myString | egrep -e '^[^-]*-myString' 
[~]$ echo test--myString | egrep -e '^[^-]*-myString' 
[~]$ echo test --myString | egrep -e '^[^-]*-myString' 
[~]$ echo test -myString | egrep -e '^[^-]*-myString' 
test -myString 
0

당신은 하나의 대시로 시작하는 문자열과 일치 할 수 있지만 여러 대시를 가지고 하나?

^-[^-] 

설명 :

^ Matches start of string 
- Matches a dash 
[^-] Matches anything but a dash 
+0

문자열의 뒷부분에 더 많은 대시 기호를 사용할 수 있습니다. –

+0

대시는 단어의 시작 부분에서만 허용됩니다. 그래서 거기에 더 많은 공간이 있다면 거기에 뒤따라있을 수 있습니다. 그러나 동일한 규칙이 적용되어야합니다. –

+0

이것은 대시와 다른 하나의 문자와도 일치합니다. 즉 -myString 중 -m과 일치합니다. –

0

[^ - {0,1} - [^ \ w -] +

+0

OP의 편집에 따르면 하위 문자열 일치가 필요하므로 앵커가 작동하지 않습니다. – Tomalak

+0

편집 용으로 업데이트되었습니다. 유일한 질문은 그가 "mystring"부분을 끝내는 방법을 결정하는 방법입니다. 이 예제에서는 공백을 사용합니다. –

+0

지금 완전히 깨졌습니다. ;-) 나는 간단한 두뇌가 필요없는 해결책을 위해 두뇌를 쌓았지만 완전한 문자열을 매칭해야 할 때가 있다고 생각하지 않는다. – Tomalak

0

, 나는 다음과 같은 표현은 어떤 모습 비하인드을 사용하지 않고

\b\-\w+ 
0

더 나은 사용 일 것 같아요 :

(?:^|(?:[\s,]))(?:\-)([^-][a-zA-Z_0-9]+) 

는 세분화 :

(
    ?:^|(?:[\s,])  # Determine if this is at the beginning of the input, 
         # or is preceded by whitespace or a comma 
) 
(
    ?:\-     # Check for the first dash 
) 
(
    [^-][a-zA-Z_0-9]+ # Capture a string that doesn't start with a dash 
         # (the string you are looking for) 
)