我正在尝试用字符串解析令牌。
我想要的是这样的输入:
string input = "asdf %(text) %(123) %(a\)a) asdf";
我可以通过regex.Replace()运行它并将其替换为“%(text)”,“%(123)”和“%(a \)a)”。
也就是说,它会匹配起始“%(”和“结束”)“之间的所有内容,除非结束”)“被转义。 (但是当然,那么你可以用另一个斜线逃避斜线,这可以防止它逃离终点线......)
我很确定标准正则表达式不能这样做,但是我想知道C#正则表达式库的各种奇特扩展功能是否可以,而不是仅仅手动遍历字符串?或者其他一些方法可以做到这一点?我觉得这是一个足够普通的程序,必须有一些方法来解决它,而不是从头开始实现解决方案,因为.net框架很大?如果我必须实现遍历字符串迭代并替换为string.Replace(),我会,但它似乎是如此不优雅。
答案 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";