正则表达式匹配未被括号括起的下划线?

时间:2009-03-24 17:04:27

标签: regex

在以下示例中,是否有人可以建议使用正则表达式来匹配下划线:

test_test
test[_test
test_]

但不符合这个:

test[_]test

这是使用.Net正则表达式库。我正在使用这个RegEx测试器来检查:

http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

5 个答案:

答案 0 :(得分:5)

试试这个:

_[^\]]|[^[]_

它由_[^\]](下划线而非])和[^[]_(不是[和下划线)的替代组成。

或者如果你想使用环顾四周的断言来真正匹配下划线而不是周围的字符:

_(?=[^\]])|_(?<=[^[]_)

这匹配任何未跟](?=[^\]]),正向前瞻)或任何不在[前面的下划线的下划线((?<=[^[]_) ,负面的后视)。这可以合并到:

_(?:(?=[^\]])|(?<=[^[]_))

答案 1 :(得分:2)

_(?!\](?<=\[_\]))

如果下划线后面没有右下角,则负前瞻立即成功。否则,它会通过一个左括号来确定下划线是否也在前面。您可以用点替换“_]”,以清楚表明您这次只对开始括号感兴趣:

_(?!\](?<=\[..))

如果您愿意,可以先执行lookbehind:

_(?<!\[_(?=\]))

重要的是第二个环视必须嵌套在第一个环绕中才能实现“NOT (x AND y)”语义。

在EditPad Pro中测试它,它匹配除了最后一个字符串以外的所有字符串:

test_test
test[_test
test_]
_]Test
Test[_
test[_]test

编辑:这是一个更容易阅读的版本:

(?<!\[)_|_(?!\])

我喜欢嵌套式外观版本的是它在实际找到下划线之前没有做任何事情。除非正则表达式引擎足够智能,否则这个“(NOT x) OR (NOT y)”版本将在每个位置做一个负面的观察。

答案 2 :(得分:1)

我不知道.Net但正则表达式将由两部分组成,一部分匹配任何字符,除了括号后跟下划线,另一部分反之亦然:

[^\[](_)|(_)[^\]]

编辑:刚刚注意到你需要添加下划线在开头或结尾的情况:

[^\[](_)|(_)[^\]]|^_|_$

答案 3 :(得分:1)

((|?!())

使用负向前瞻/后方(而不是正向前瞻/后方和排除字符)。

答案 4 :(得分:0)

尝试

^.*(\[_[^\]])|([^\[]_\])|([^\[]_[^\]]).*$

编辑:现在处理

test_test

未经测试,但已阅读:任何字符串后跟 [_,然后是任何字符 ] 任何字符 [然后_]

请注意,对于

等情况,这可能会失败
_]Test
Test[_

我不知道这对你来说是否有问题?

使用您的所有示例成功测试