具有特定单词边界的正则表达式

时间:2016-05-26 18:05:15

标签: c# regex word-boundary

假设我有一个类型

的字符串
  

(价格+ Discounted_Price)* 2-Max.Price

和包含每个元素替换内容的字典

  

价格:A1 Discounted_Price:A2 Max.Price:A3

如何在不触及另一个短语的情况下准确替换每个短语。 Price的含义搜索不应修改Price中的Discounted_Price。结果应该是(A1+A2)*2-A3而不是(A1+Discounted_A1) - Max.A1或其他任何内容

谢谢。

2 个答案:

答案 0 :(得分:2)

如果您的变量可以包含字母数字/下划线/点字符,则可以将它们与[\w.]+正则表达式匹配,并添加包含.的边界:

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
    public static void Main()
    {
        var s = "(Price+Discounted_Price)*2-Max.Price";
        var dct = new Dictionary<string, string>();
        dct.Add("Price", "A1");
        dct.Add("Discounted_Price", "A2");
        dct.Add("Max.Price","A3");
        var res = Regex.Replace(s, @"(?<![\w.])[\w.]+(?![\w.])",     // Find all matches with the regex inside s
            x => dct.ContainsKey(x.Value) ?   // Does the dictionary contain the key that equals the matched text?
                  dct[x.Value] :              // Use the value for the key if it is present to replace current match
                  x.Value);                   // Otherwise, insert the match found back into the result
        Console.WriteLine(res);
    }
}

请参阅IDEONE demo

如果匹配前面有一个单词或一个点字符,则(?<![\w.])负面的后观效果会使匹配失败,如果跟随一个单词或点字符,则(?![\w.])否定前瞻将使匹配失败

请注意,[\w.]+允许在前导和尾随位置使用点,因此,您可能希望将其替换为\w+(?:\.\w+)*并使用@"(?<![\w.])\w+(?:\.\w+)*(?![\w.])"

<强>更新

由于您已经将要替换的关键字提取为列表,因此您需要使用更复杂的单词边界(不包括点):

var listAbove = new List<string> { "Price", "Discounted_Price", "Max.Price" };
var result = s;
foreach (string phrase in listAbove)
{
    result = Regex.Replace(result, @"\b(?<![\w.])" + Regex.Escape(phrase) +  @"\b(?![\w.])", dct[phrase]);
}

请参阅IDEONE demo

答案 1 :(得分:0)

对于字边界,您可以使用\ b 使用:\ bPrice \ b

但这将取代Max.Price中的Price。

也许您想使用常规字符串替换:

“价格+” - &gt; A1 +“+”

示例:

string test = "(Price+Discounted_Price)*2-Max.Price";
string a1 = "7";
string a2 = "3";
string a3 = "4";

test = test.Replace("(Price", "(" + a1);
test = test.Replace("Discounted_Price", a2);
test = test.Replace("Max.Price", a3);

结果:

测试是:(7 + 3)* 2-4