string bar = String.Format(@"^{0}*(q*x|x*q)*", foo.Text);
正则表达式类传递上面的bar变量并在触发事件时初始化。但是,它只在有重复文本时返回命中。文本框中的E.G bb返回以b开头的所有结果,1b返回每个单词的匹配。
???我的正则表达式或逻辑是否有问题? (或两者!:P)
编辑我正在尝试匹配从文本文件加载的字符串列表。所有包含q和x至少一次的单词,从文本框中的字母开始。例子: arquifoux benzofuroquinoxaline benzoquinoxaline disquixote equiaxe
答案 0 :(得分:0)
我很确定你的正则表达式是不正确的。 我认为你在*之前缺少一些句号(。)
如果你打破了你所拥有的:^{0}*(q*x|x*q)*
,那就是:
^{0}* <-- starts with 0 or more of whatever the text box had.
(q*x|x*q)* <-- then contains 0 or more of this pattern.
由于你要求“0或更多”,它基本上匹配任何东西。输入“bb”似乎有效,因为这会使起始正则表达式:^bb*
分解为:
^b <-- starts with 1 letter 'b'
b* <-- followed by 0 or more letter 'b's
我认为你想要的是:
^{0}.*(q.*x|x.*q)+
分解为:
^{0} <-- starts with 1 of whatever my text box had
.* <-- then 0 or more of anything
(q.*x|x.*q)+ <-- then 1 or more of q + anything + x, or x + anything + q
答案 1 :(得分:0)
我想你想要
string bar = String.Format(@"^{0}.*?(q.*?x|x.*?q).*", foo.Text);
.
匹配任何字符。
.*?
中的问号只会使匹配变得非贪婪(即'q'将匹配它找到的第一个q),尽管在你的情况下它们并不是真的必要。
您之前的'q *'匹配“0个或更多q个字符”。
您可以进一步改善正则表达式:
string bar = String.Format(@"^{0}[a-z]*?(q[a-z]*?x|x[a-z]*?q)[a-z]*", foo.Text);
仅匹配小写字母。 (您可以将不区分大小写的标记输入正则表达式以使其匹配任何情况。)
答案 2 :(得分:0)
你在正则表达式中缺少一些匹配来匹配a,q和x之间的字符。对于单词匹配,你会想要这个(\ w而不是。仅限于单词字符)
^{0}\w*(q\w*x|x\w*q)
这里可能不需要你,但是在将用户直接插入正则表达式语句之前使用Regex.Escape转义用户输入的文本是好的
答案 3 :(得分:0)
string bar = string.Format("^(\w+\s+)*{0}\w+(q\w*x|x\w*q)+.*", Regex.Escape(Regfoo.Text));
这应该: