类似于正则表达式的构造匹配%([text]),其中[text]可以包含转义的parens

时间:2013-10-10 22:27:20

标签: c# regex

我正在尝试用字符串解析令牌。

我想要的是这样的输入:

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

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

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

我很确定标准正则表达式不能这样做,但是我想知道C#正则表达式库的各种奇特扩展功能是否可以,而不是仅仅手动遍历字符串?或者其他一些方法可以做到这一点?我觉得这是一个足够普通的程序,必须有一些方法来解决它,而不是从头开始实现解决方案,因为.net框架很大?如果我必须实现遍历字符串迭代并替换为string.Replace(),我会,但它似乎是如此不优雅。

2 个答案:

答案 0 :(得分:1)

怎么样

var regex = new Regex(@"%\(.*?(?<!\\)(?:\\\\)*\)");
var result = regex.Replace(source,"");
  • %\(匹配文字%(
  • .*?匹配任何非贪婪的
  • 前一个字符的
  • (?<!\\)不能是\
  • (?:\\\\)*匹配零或更多文字\\(即匹配转义\
  • \)匹配文字)

答案 1 :(得分:0)

这对我有用:

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

输出

"asdf  asdf";