在提出这个问题之前,我已经用Google搜索了这个问题,并查看了所有与StackOverflow相关的问题。
问题非常简单
我有一个字符串“北大西洋公约组织”
我有一个模式“a。* z”,目前它会匹配
北部ATLATIC条约组织
但是我需要它来匹配完整的单词(例如orgANIZation)
我试过“\ ba z \ b”和“\ Ba z \ B”作为模式,但我觉得我不太明白
我应该如何更改模式以匹配字符串包含的完整单词(不匹配多个单词)
模式是动态生成的,用户输入a * z,我的应用程序将其转换为匹配字符串中完整单词部分的模式。
我的问题是我不知道用户要搜索什么。理想情况下,我会将一些正则表达式预先添加到用户的表达式中。
谢谢!
答案 0 :(得分:4)
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 - 垃圾进入,垃圾出来。为你的系统提供一个糟糕的正则表达式,如果你没有适当地修复它,你就无法得到你想要的东西。