如何在正则表达式中使用变量?

Posted

技术标签:

【中文标题】如何在正则表达式中使用变量?【英文标题】: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 格式化! :) 【参考方案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

【讨论】:

以上是关于如何在正则表达式中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

在java下如何在正则表达式中添加变量

如何在 python 中使用变量作为正则表达式? [复制]

如何在正则表达式中使用变量?

如何在 C++ 的正则表达式中使用变量? [关闭]

如何使用正则表达式在字符串表达式中查找以@开头的变量名?

python中的正则表达式:如何在模式中使用变量字符串? [复制]