C#[regex]在特定单词之前修剪空格

时间:2018-11-15 16:29:28

标签: c# regex

我要修剪数字“ usd”和“ eur”之前的所有空格。 我有这样的正则表达式模式:

@"\b(\d\s*)+\s(usd|eur)"

如何从结果匹配中排除空格和usd | eur?

字符串示例:"sdklfjsd 10 343 usd ds 232 300 eur"

结果应为:"sdklfjsd 10343 usd ds 232300 eur"

string line = "2 300 $ 12 Asdsfd 2  300  530 usd and 2  351 eur";
        MatchCollection matches;
        Regex defaultRegex = new Regex(@"\b(\d+\s*)+(usd|eur)");        
        matches = defaultRegex.Matches(line);
        WriteLine("Parsing '{0}'", line);
        for (int ctr = 0; ctr < matches.Count; ctr++)
            WriteLine("={0}){1}", ctr, matches[ctr].Value);

4 个答案:

答案 0 :(得分:1)

尝试使用正则表达式:(\d+) *(\d+)(?= (?:usd|eur))

Demo

答案 1 :(得分:1)

假设只有两个数字,您可以使用

\b(\d+)\s*(\d+)(?=\s(usd|eur)),替换字符串为$1$2

答案 2 :(得分:1)

我有一种更为雄辩的方法,但是可以使用MatchEvaluator

轻松完成。
new Regex(@"\b(\d+\s*)+(?=\s(usd|eur))").
    Replace("sdklfjsd 10   343  usd ds 232 300 eur",
        m => string.Join("", m.Groups[1].Captures.Cast<Capture>().Select(c => c.Value.Trim())))

正则表达式\b(\d+\s*)+(?=\s(usd|eur))仅使用先行匹配来匹配后跟\s(usd|eur)的数字,并使用分组将每个连续匹配项与\d+\s*匹配(我假设{{1} }限制您的问题,以便使用\b仅匹配abc12 34 56 eur,否则将其删除)。

然后,对于每个匹配项,它将获取该组的所有捕获内容,将其全部修剪,然后将它们连接在一起以产生替换文本。

(请注意,一般来说,货币代码应大写,因此您还有另一个问题)。

答案 3 :(得分:0)

您还可以使用正向后看和正向前看来匹配要删除的所有空格:

(?<=\d)\s+(?=(?:\d+\s+)*\d+\s+(?:eur|usd)\b)

说明

  • (?<=\d)断言左侧的内容是积极的向后看
  • \s+匹配1个以上空白字符
  • (?=积极肯定地断言右边是
    • (?:\d+\s+)*重复0+次,匹配1+个数字,后跟1+个空格字符
    • \d+\s+(?:eur|usd)\b匹配1+个数字,后跟1+个空格字符和eur或usd
  • )积极回望

Regex demo

string line = "2 300 $ 12 Asdsfd 2  300  530 usd and 2  351 eur";
string result = Regex.Replace(line , @"(?<=\d)\s+(?=(?:\d+\s+)*\d+\s+(?:eur|usd)\b)", "");
Console.WriteLine(result); // 2 300 $ 12 Asdsfd 2300530 usd and 2351 eur

Demo C#