English 中文(简体)
一个我无法解决的正则表达式问题(负前瞻)
原标题:
  • 时间:2009-02-09 16:32:12
  •  标签:

我如何使用正则表达式来完成这个任务?

我想匹配这个字符串:-myString

但我不想匹配这个字符串中的-myString: --myString

myString当然可以是任何东西。

这可能吗?

編輯:

这是我发布问题后迄今为止得到的更多信息:

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

This regex returns me 3 matches: -string1, - and -string2

理想情况下,我只希望它返回给我匹配-string1的内容。

最佳回答

假设你的正则表达式引擎支持(负)后向查找:

/(?<!-)-myString/

Perl可以,JavaScript不可以,例如。

问题回答

你想匹配以短线开头的字符串,但不想匹配有多个短线的字符串?

^-[^-]

解释:

^ Matches start of string
- Matches a dash
[^-] Matches anything but a dash
/^[^-]*-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

根据最后一次编辑,我猜以下表达会更好。

-w+

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

不使用任何后顾之忧,使用:

(?:^|(?:[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)
)




相关问题
热门标签