【问题标题】:String.Format for creating regex patternsString.Format 用于创建正则表达式模式
【发布时间】:2012-02-09 23:08:44
【问题描述】:

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

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

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

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

EDIT 我正在尝试匹配从文本文件加载的字符串列表。所有同时包含 q 和 x 至少一次的单词,以文本框中的字母开头。例子: 阿基富 苯并呋喃喹喔啉 苯并喹喔啉 诡谲 等轴

【问题讨论】:

  • 你想达到什么目的?请阅读tinyurl.com/so-hints
  • 请提供您与此正则表达式匹配的字符串。

标签: c# regex string.format


【解决方案1】:

我想你想要

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

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

【讨论】:

  • palmface 是的,正则表达式失败。谢谢你纠正我的愚蠢!
【解决方案2】:

我很确定您的正则表达式不正确。 我认为您在 * 之前缺少一些句点 (.)

如果你分解你所拥有的:^{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

【讨论】:

    【解决方案3】:

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

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

    这里可能不需要您,但最好使用 Regex。在将用户输入的转义文本直接插入到正则表达式语句之前转义它

    【讨论】:

      【解决方案4】:
      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. 匹配更多字符。 .*

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2016-01-21
        相关资源
        最近更新 更多