【问题标题】:How to use variables with regex?如何在正则表达式中使用变量?
【发布时间】:2017-10-11 06:04:50
【问题描述】:

这是输入字符串:23x^45*y or 2x^2 or y^4*x^3

我在字母x 之后匹配^[0-9]+。换句话说,我匹配x,然后是^,然后是数字。问题是我不知道我匹配的是x,它可能是我作为变量存储在我的字符数组中的任何字母。

例如:

foreach (char cEle in myarray) // cEle is letter in char array x, y, z, ...
{
    match CEle in regex(input) //PSEUDOCODE
}

我是 regex 的新手,我知道如果我定义 regex 变量可以做到这一点,但我不知道如何。

【问题讨论】:

  • 感谢 dtb 格式化! :)

标签: c# .net regex


【解决方案1】:

您可以使用可以从字符数组动态创建的模式@"[cEle]\^\d+"

string s = "23x^45*y or 2x^2 or y^4*x^3";
char[] letters = { 'e', 'x', 'L' };
string regex = string.Format(@"[{0}]\^\d+",
    Regex.Escape(new string(letters)));
foreach (Match match in Regex.Matches(s, regex))
    Console.WriteLine(match);

结果:

x^45
x^2
x^3

需要注意的几点:

  • 必须将正则表达式中的^ 转义,否则它具有特殊含义“行首”。
  • 在将来自用户的文字字符串插入正则表达式时,最好使用Regex.Escape,以避免他们键入的任何字符被误解为特殊字符。
  • 这也将匹配具有较长名称(如 tax^2)的变量末尾的 x。这可以通过要求单词边界 (\b) 来避免。
  • 如果你把x^1写成x,那么这个正则表达式将不匹配它。这可以通过使用(\^\d+)? 来解决。

【讨论】:

  • 是的,单词边界很重要。 +1 :)
  • 永远不要使用Regex.Escape 转义字符类中使用的任意字符,因为此方法仅用于转义那些被认为是字符类外部特殊的字符。如果列表在 it will close the character class earlier than expected 中的某处包含 ]
【解决方案2】:

尝试使用此模式捕获数字但不包括 x^ 前缀:

(?<=x\^)[0-9]+

string strInput = "23x^45*y or 2x^2 or y^4*x^3";
foreach (Match match in Regex.Matches(strInput, @"(?<=x\^)[0-9]+"))
    Console.WriteLine(match);

这应该打印出来:

45
2
3

如果需要,不要忘记使用选项IgnoreCase 进行匹配。

【讨论】:

  • 我的问题不清楚,我想捕获 ^ 但我不知道如何使用变量作为我的模式
【解决方案3】:

在我看来,最简单快捷的实现方式如下:

输入:This?_isWhat?IWANT

        string tokenRef = "?";
        Regex pattern = new Regex($@"([^{tokenRef}\/>]+)");

该模式应该删除我的 tokenRef 并存储以下输出:

  • Group1 这个
  • Group2 _isWhat
  • Group3 IWANT

【讨论】:

    猜你喜欢
    • 2019-11-08
    相关资源
    最近更新 更多