Regex 正则表达式是否匹配未用括号括起来的下划线?

Regex 正则表达式是否匹配未用括号括起来的下划线?,regex,Regex,在以下示例中,是否有人建议使用正则表达式来匹配下划线: test_test test[_test test_] 但与此不符: test[_]test 这是使用.Net正则表达式库。我使用这个正则表达式测试仪来检查: 我不知道.Net,但正则表达式将由两部分组成,一部分匹配除括号后加下划线外的任何字符,另一部分则相反: [^\[](_)|(_)[^\]] 编辑:刚刚注意到您需要添加下划线位于开头或结尾的情况: [^\[](_)|(_)[^\]]|^_|_$ 试一试 编辑:现在处理 test

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

test_test
test[_test
test_]
但与此不符:

test[_]test
这是使用.Net正则表达式库。我使用这个正则表达式测试仪来检查:


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

[^\[](_)|(_)[^\]]
编辑:刚刚注意到您需要添加下划线位于开头或结尾的情况:

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

编辑:现在处理

test_test
未测试,但读取:任何字符串后跟
[\uu
然后是任何字符,但
任何字符,但
[
然后是

注意,对于以下情况,这可能会失败

_]Test
Test[_
我不知道这对你来说是不是个问题

使用所有示例成功测试

尝试以下方法:

_[^\]]|[^[]_
它由
.[^\]
(下划线和非
]
)和
[^[].
(非
[
和下划线)的交替组成

或者,如果您希望使用环视断言来真正匹配下划线而不是周围的字符:

_(?=[^\]])|_(?<=[^[]_)
编辑:这里有一个更容易阅读的版本:

(?<!\[)_|_(?!\])
(?
我喜欢嵌套环视版本,因为它在实际找到下划线之前不会做任何事情。除非正则表达式引擎足够聪明地将其优化掉,否则这个“
(不是x)或(不是y)
”版本将在每个位置进行负向环视。

(?|(?!]))


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

不适用于:test[\u test(我在这里使用正则表达式测试仪测试:)hi Moskie..未选中任何选项..此正则表达式匹配“test[\u test”中的下划线stringThis很接近,只是它匹配了一个额外的字符,而不仅仅是下划线。我尝试将其修改为使用前瞻,但它不适用于所有情况。(?=[^])|(?=[^[])使用字符串测试:“test[]test[\u test]test[\u test]test\u test”。找到3个匹配项,应该找到5个。@Moskie:在后一种情况下,您需要查找后面的断言。我认为这样做:(?=[^]])|(?@Moskie:最好使用
(?=[^\]])| |用字符串测试:“test[]test[\u test[\u test]test[u test]test\u test”.找到0个结果,应该找到5个。我已经在.NET和Java中对其进行了测试,得到了相同的结果:前五个字符串匹配,最后一个不匹配。如果您使用.NET,您可能会发现另一个测试程序非常有用:www.lastdomainnameonearth.com
_(?:(?=[^\]])|(?<=[^[]_))
_(?!\](?<=\[_\]))
_(?!\](?<=\[..))
_(?<!\[_(?=\]))
test_test
test[_test
test_]
_]Test
Test[_
test[_]test
(?<!\[)_|_(?!\])