如何在正则表达式中使用变量?
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【讨论】:
以上是关于如何在正则表达式中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章