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

时间:2010-04-27 18:57:50

标签: c# .net regex

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

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

例如:

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用可以从角色阵列动态创建的模式@"[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是个好主意,以避免他们输入的任何字符被误解为特殊字符。
  • 这也会使变量末尾的x与较长的名称(如tax^2)相匹配。这可以通过要求字边界(\b)来避免。
  • 如果您将x^1写为x,则此正则表达式将与之不匹配。可以使用(\^\d+)?
  • 修复此问题

答案 1 :(得分:0)

尝试使用此模式捕获数字,但不包括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进行匹配。

答案 2 :(得分:0)

从我的角度来看,最简单快捷的实施方式如下:

<块引用>

输入:这个?_isWhat?IWANT

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

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

  • Group1 这个
  • Group2 _isWhat
  • Group3 IWANT