C#正则表达式只匹配字符串中完整单词的一部分

时间:2009-05-04 16:30:50

标签: c# .net regex

在提出这个问题之前,我已经用Google搜索了这个问题,并查看了所有与StackOverflow相关的问题。

问题非常简单

我有一个字符串“北大西洋公约组织”

我有一个模式“a。* z”,目前它会匹配

北部ATLATIC条约组织

但是我需要它来匹配完整的单词(例如orgANIZation)

我试过“\ ba z \ b”和“\ Ba z \ B”作为模式,但我觉得我不太明白

我应该如何更改模式以匹配字符串包含的完整单词(不匹配多个单词)

模式是动态生成的,用户输入a * z,我的应用程序将其转换为匹配字符串中完整单词部分的模式。

我的问题是我不知道用户要搜索什么。理想情况下,我会将一些正则表达式预先添加到用户的表达式中。

谢谢!

5 个答案:

答案 0 :(得分:4)

orgANIZation中的ANIZ 一个完整的单词 - 它是单词的一部分。你的模式不是你写的 - a*z不符合你的描述;你可能正在使用a.*z代替。所以,试试a[^ ]*z所以它不会匹配空格。如果除了空格之外还有其他字符,您不想匹配,例如当然,也可以将某些标点符号放在[^...]结构中。

答案 1 :(得分:3)

"a[^\s]*z"

这意味着'a'后跟任意数量的非空白字符,后跟'z'。

编辑:您似乎希望将“*”解释为通配符。因此,用户不能输入正则表达式,而是输入具有某些通配符的字符串。您可以通过推理预期的含义将这些通配符转换为正则表达式。假设“*”应表示“零个或多个不是空格的字符”。然后,使用相应的正则表达式替换此字符:

                       [^\s]*
                       `-.-´|
     Character class-----´  `---Zero or more of these

     '\s': "Whitespace"
     Inside Character class: if it starts with '^': "not"

你可能还想定义'?'完全匹配单个非空白字符。这是相同的字符类,但最后省略了'*'。

所以,你所做的是正则表达式 - 将“*”替换为“[^\s]*”,将“?”替换为“[^\s]”。

答案 2 :(得分:1)

这就是你要找的东西:

new Regex( @"\b[^ ]*a[^ ]*z[^ ]*\b" );

它只匹配一个单词(不允许空格) - 但整个单词。您可以将用户输入转换为这样的正则表达式 - 只需用[^] *替换* - 它甚至可以使用多个通配符。

答案 3 :(得分:1)

直接与您的问题无关,但您可能需要查看一个RegEx可视化工具,该工具会根据文本输入和给定的正则表达式显示捕获的结果。

这样的工具对于找到合适的模式非常有帮助,这可能非常棘手。专门用于.net RegEx的一个很好的工具是RegExLab,虽然有点旧,但在显示正则表达式的匹配方面做得很好。由于该页面是德语,只需单击regexlab.006.zip链接即可。源代码也包括在内。

答案 4 :(得分:1)

Regex reWord = new Regex("\\b[A-Za-z]*?(a.*z)[A-Za-z]*\\b");

......这将归还“大西洋公约组织”,其中一个。* z被捕获为“反对条约组织”。

问题是你的方法所固有的 - 除非你通过修改{解析用户提供的* z(或a。* z的“正则表达式”,这在你的帖子中并不十分清楚) {1}}到[^ \ s] *?正如Svante建议的那样(或者也许\ w *?),你会吞噬掉比你想要的更多的角色。

“。*”,一般来说,当你想要具体时,这是一个坏主意。它会匹配除了换行符之外的所有内容,并且没有任何东西可以附加到它上面来阻止它。

*

...将只返回“组织”。

或者,如果您绝对必须,无论出于何种原因,请避免修改用户提供的正则表达式,或者尝试将字符串拆分为单词数组,并针对正则表达式单独测试每个单词。

最终,它是GIGO - 垃圾进入,垃​​圾出来。为你的系统提供一个糟糕的正则表达式,如果你没有适当地修复它,你就无法得到你想要的东西。