0

我正在尝试解析字符串中的标记。

我想要的是这样的输入:

string input = "asdf %(text) %(123) %(a\)a) asdf";

我可以通过 regex.Replace() 运行它并将其替换为“%(text)”、“%(123)”和“%(a\)a)”。

也就是说,它将匹配开始“%(”和结束“)”之间的所有内容,除非结束“)”被转义。(但当然,你可以用另一个斜线来逃避斜线,这将防止它逃避结束括号......)

我很确定标准正则表达式不能做到这一点,但我想知道 C# 正则表达式库的各种花哨的扩展功能是否可以,而不是完全手动遍历字符串?或者其他一些可以做到这一点的方法?我觉得这是一个足够普遍的程序,鉴于 .net 框架的庞大性,必须有某种方法来解决它,而无需从头开始实施解决方案?如果我必须实现遍历字符串并用 string.Replace() 替换,我会的,但它看起来太不优雅了。

4

2 回答 2

1

怎么样

var regex = new Regex(@"%\(.*?(?<!\\)(?:\\\\)*\)");
var result = regex.Replace(source,"");
  • %\(匹配文字%(
  • .*?匹配任何非贪婪的东西
  • (?<!\\)下一个匹配的前一个字符不能是\
  • (?:\\\\)*匹配零个或多个文字\\(即匹配转义\
  • \)匹配文字)
于 2013-10-10T23:17:21.120 回答
0

这对我有用:

    String something = "\"asdf %(text) %(123) %(a\\)a) asdf\";";
    String change = something.replaceAll("%\\(.*\\)", "");
    System.out.println(change);

输出

"asdf  asdf";
于 2013-10-10T22:31:10.750 回答