繁体   English   中英

使用正则表达式替换整个字符串/表达式的一部分

[英]Using Regex to replace part of the entire string/expression

正则表达式有时简单但复杂。 坚持替换具有变量的表达式,假设变量具有以下模式:

\w+(\.\w+)*

我想用我的变量替换点 (.) 来替换所有出现的变量,因为我最终必须对标记器无法识别带有点的变量的表达式进行标记。 所以我想在解析之前用下划线替换它们。 然而,在标记化之后,我想获得具有原始值的变量标记。

表达:

(x1.y2.z3 + 9.99) + y2_z1 - x1.y2.z3

三个变量:

x1.y2.z3

y2_z1

x1.y2.z3

期望输出:

(x1_y2_z3 + 9.99) + y2_z1 - x1_y2_z3
  • 问题 1:在这种情况下如何使用 Regex 替换?

  • 问题 2:有没有更好的方法来解决上述问题,因为变量可以有下划线,所以用下划线替换点不是将原始变量恢复为标记的可行解决方案?

这个正则表达式模式似乎有效: [a-zA-Z]+\\d+\\S+

要替换在匹配项中找到的点,请使用 MatchEvaluator:

    private static char charToReplaceWith = '_';
    static void Main(string[] args)
    {
        string s = "(x1.y2.z3 + 9.99) + y2_z1 - x1.y2.z3";
        Console.WriteLine(Regex.Replace(s, @"[a-zA-Z]+\d+\S+", new MatchEvaluator(ReplaceDotWithCharInMatch)));
        Console.Read();
    }

    private static string ReplaceDotWithCharInMatch(Match m)
    {
        return m.Value.Replace('.', charToReplaceWith);
    }

这给出了这个输出: (x1_y2_z3 + 9.99) + y2_z1 - x1_y2_z3

我不完全理解你的第二个问题以及如何处理已经有下划线的标记化变量,但你应该能够选择一个字符来替换(即, if (string.Contains('_'))true则您选择了一个不同的字符来替换,但可能必须维护一个字典,上面写着“我用下划线替换了所有点,用^替换了所有下划线,等等。)。

尝试这个:

        string input = "(x1.y2.z3 + 9.99) + y2_z1 - x1.y2.z3";
        string output = Regex.Replace(input, "\\.(?<![a-z])", "_");

这将仅替换后跟字母 (az) 的句点。

使用表达式”负先行通过使一组与启动(?!

一个点后跟一些非数字的东西就像这样简单:

// matches any dot NOT followed by a character in the range 0-9
String output = Regex.Replace(input, "\\.(?![0-9])", "_");

这具有的优点是,虽然[0-9]是表达式的一部分,它仅检查为是匹配的后面,但实际上不是匹配的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM