2

快速的手将不胜感激。我正在尝试制作一个小算法来将文本框中的文本输入到正则表达式中。如下:

    string bar = String.Format(@"^{0}*(q*x|x*q)*", foo.Text);

正则表达式类通过上面的 bar 变量并在事件触发时初始化。但是,它仅在有重复文本时才返回命中。文本框中的 EG bb 返回所有以 b 开头的结果,而 1b 返回每个单词的匹配项。

???我的正则表达式或逻辑有问题吗?(或两者兼有!:P)

编辑我正在尝试匹配从文本文件加载的字符串列表。所有同时包含 aq 和 x 至少一次的单词,以文本框中的字母开头。例子: arquifoux benzofuroquinoxaline benzoquinoxaline disquixote equiaxe

4

4 回答 4

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
于 2012-02-09T23:44:34.237 回答
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);

仅匹配小写字母。(您可以将不区分大小写的标志输入到您的正则表达式中以使其匹配任何大小写)。

于 2012-02-09T23:46:10.440 回答
0

您在正则表达式中缺少一些匹配项来匹配您的 a、q 和 x 之间的字符。对于单词匹配,您将希望这个(\w 而不是 . 仅限于单词字符)

^{0}\w*(q\w*x|x\w*q)

此处可能不需要您,但最好使用 Regex.Escape 转义的用户输入的文本,然后再将其直接插入到正则表达式语句中

于 2012-02-10T00:04:40.770 回答
0
string bar = string.Format("^(\w+\s+)*{0}\w+(q\w*x|x\w*q)+.*", Regex.Escape(Regfoo.Text)); 

这应该:

  1. 匹配行开头。^
  2. 匹配前面的任何完整单词或不匹配。(\w+\s+)*
  3. 匹配出现在单词 {0} 开头的指定文本。
  4. 匹配包含 q 然后 x 或 x 然后 q 的单词的其余部分。\w+(q\w*x|x\w*q)+
  5. 匹配任何更多的字符。.*
于 2012-02-10T00:05:07.580 回答