考虑以下
案例1: [成功]
Input : X(P)~AK,X(MV)~AK
Replace with: AP
Output: X(P)~AP,X(MV)~AP
案例2: [失败]
Input: X(P)~$B,X(MV)~$B
Replace with: C$
Output: X(P)~C$,X(MV)~C$
Actual Output: X(P)~C$B,X(MV)~C$B
我正在使用以下REGEXP
@"~(\w*[A-Z$%])"
这适用于案例1,但对第二个案件进行了审理。
需要帮助
我正在使用C#3.0
由于
答案 0 :(得分:2)
目前还不清楚您的匹配要求到底是什么,但将正则表达式更改为@"~(\w*[A-Z$%]+)"
应该可以解决问题。 (对于给出的示例,只有普通@"~([A-Z$%]+)"
也应该有用。)
答案 1 :(得分:1)
看起来你想要这样的东西:
public static String replaceWith(String input, String repl) {
return Regex.Replace(
input,
@"(?<=~)[A-Z$%]+",
repl
);
}
(?<=…)
就是所谓的lookbehind。它用来断言左边有一个波浪号,但波浪号不是比赛的一部分。
现在我们可以按如下方式测试它(as seen on ideone.com):
Console.WriteLine(replaceWith(
"X(P)~AK,X(MV)~AK", "AP"
));
// X(P)~AP,X(MV)~AP
Console.WriteLine(replaceWith(
"X(P)~$B,X(MV)~$B", "C$"
));
// X(P)~C$,X(MV)~C$
Console.WriteLine(replaceWith(
"X(P)~THIS,X(MV)~THAT", "$$$$"
));
// X(P)~$$,X(MV)~$$
请注意上一个示例:$
是substitutions中的特殊符号,可以有特殊含义。 $$
实际上可以获得一美元的符号。
答案 2 :(得分:0)
你的表达式(贪婪)会替换第一个字符串,该字符串以零或多个工作字符开头,以'〜'替换后以[A-Z $%]结尾。
在第一种情况下你有~AK,所以\ w * [A-Z $%]评估为'AK',匹配\ w * - &gt; A和[A-Z $%] - &gt; ķ
在第二种情况下你cae~ $ C所以\ w * [A-Z $%]评估为'$',匹配\ w * - &gt;什么都没有,[A-Z $%] - &gt; $
我认为重要的是\ w是可选的(零或更多),但[A-Z $%]是强制性的。这就是为什么第二种情况给出'$'而不是'$ C'作为匹配部分。
由于我不知道你想要达到的目的,我无法告诉你如何修复你的表达。