String.Format用于创建正则表达式模式

时间:2012-02-09 23:08:44

标签: c# regex string.format

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

    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

4 个答案:

答案 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)); 

这应该:

  1. 匹配行开头。 ^
  2. 匹配前面的任何或没有完整的单词。 (\ W + \ S +)*
  3. 匹配在单词{0}开头出现一次的指定文本。
  4. 匹配包含q的单词的其余部分,然后匹配x或x,然后q。 \ W +(Q \ W * X | X \ W * Q)+
  5. 匹配更多字符。 *