以下正则表达式有什么问题(c#3.0)

时间:2010-08-13 05:50:41

标签: regex c#-3.0

考虑以下

案例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

由于

3 个答案:

答案 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'作为匹配部分。

由于我不知道你想要达到的目的,我无法告诉你如何修复你的表达。