我要修剪数字“ 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);
答案 0 :(得分:1)
尝试使用正则表达式:(\d+) *(\d+)(?= (?:usd|eur))
答案 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 )
积极回望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