正则表达式用于匹配模式 [xx_-].[xx_-] C#

3

你好,我正在尝试编写一个正则表达式来匹配以下模式:[任何东西].[任何东西]

所以这个模式需要以方括号开头,然后可以包含由(小写字母、数字、下划线、空格和破折号)组成的任何字符,后跟一个闭合的方括号,后跟一个点,再跟另一组包含任何内容的方括号。

目前我已完成以下内容:

(\\[)((?:[a-z][a-z]+)).*?(\\])(\\.)(\\[)((?:[a-z][a-z]+)).*?(\\])

这个代码适用于 [某些东西].[任何东西],但也适用于 [某些东西].[任何 <--不应匹配(必须以方括号结尾)

还适用于 [某些东西]。 <-- 不应匹配

如果能提供帮助将不胜感激,谢谢。

编辑:

 string pattern = @"\[[^\]]*\]\.\[[^\]]*\]";
 foreach (Match match in Regex.Matches(haystack, pattern,RegexOptions.IgnoreCase | RegexOptions.Singleline |RegexOptions.Multiline))
{ 
    do some stuff
}

http://gskinner.com/RegExr/ 将会有帮助。 - Liam
你希望[any[anything].[anything]匹配[any[anything].[anything][anything].[anything]、两者都匹配还是都不匹配呢? - Scott Chamberlain
不是这个,只是[任何内容].[任何内容] - user1336827
4个回答

4

您可以使用此正则表达式来避免回溯

@"\[[^\]]*\]\.\[[^\]]*\]"

该表达式由两个相同的子表达式组成,用点号\.隔开。子表达式的组成方式如下:
  • \[ - 一个左方括号,
  • [^\]]* - 一个不包含右方括号的任意字符序列,
  • \] - 一个右方括号。

取决于是否允许任何字符 - 列表中说可以使用a-z/下划线/空格,但不能使用@符号或加号。可能只需要在问题中进行澄清。 - Charleh
@user1336827 这很奇怪 - 不应该这样,因为右方括号是正则表达式的一部分。你能展示一下你的 C# 代码中有关正则表达式的部分吗? - Sergey Kalinichenko
@dasblinkenlight 在这种情况下,您可以避免转义。\[[^]]*]\.\[[^]]*] - hwnd
@user1336827,你的代码对我来说运行得很好 - 这是一个链接:(http://ideone.com/Ito30l)。 - Sergey Kalinichenko
嗯,我再看一下,这个答案确实是最干净的。 - user1336827
显示剩余4条评论

2

这似乎有效:

\[.*\]\.\[.*\]

示例

更新以解决贪婪问题:

\[[^\[]*].\[[^\]]*\]

Example 2


2

我成功地获得了

\[[a-z0-9\s_-]*\]\.\[[a-z0-9\s_-]*\]

我尝试了一切,似乎都可以正常工作,但我肯定会遇到一些例外情况,因为正则表达式就是这样的野兽!

编辑:

我可能会使用这个,因为它不跨越换行符并且不贪婪(贪婪会导致它跨越多个项目,这是不可取的)。

\[[a-zA-Z0-9 -_]*?\]\.\[[a-zA-Z0-9 -_]*?\]

http://regexr.com?37fvh


可能太贪心了 - 你可能需要在同一行上使用多个捕获来检查它,并相应地调整贪婪度。 - Charleh
这也将匹配之间的换行符,这可能不是您想要的,因此请使用实际空格而不是\s。 - Charleh
1
*?量词没有意义,请使用* - Firas Dib
不确定你在谈论哪种正则表达式,但由于这是C#正则表达式,*?指定了前面零个或多个的懒惰匹配。表示贪婪匹配,并将尽可能匹配尽可能多的字符,因此将[hello] . [world] abc [hello] . [world]作为单个匹配,这不是OP想要的。问号使变成懒惰模式,因此将尽可能少地匹配字符。这意味着它们毫无意义吗?当您的评论是错误的时,为什么会被点赞? - Charleh

0
如果你想让你的正则表达式匹配字符串的结尾,你可以使用'$'符号。
例如:
.*\]$

将匹配任何以 ] 结尾的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接