匹配字符串中的两个正则表达式

时间:2019-02-13 16:00:26

标签: c# regex selenium-webdriver

我有此文字“£24,250.00(含增值税)”

我想要一个仅显示“ 24250.00”的正则表达式

我设法用了最后一部分:

( \(inc\. VAT\))

另外,我可以通过以下方式获得£和:

[£,]

但是我似乎无法弄清楚如何组合两个表达式以返回我想要的东西。

请注意,该数字是动态的,因此会根据网站上的适用费用而变化。

从理论上讲,我可以在我的C#代码中通过两个单独的正则表达式运行它,每个正则表达式都会修剪我想要的东西。但是,有一种方法可以只用一个表达式来完成吗?

原因是我有一个GetConvertedExtension方法,该方法采用IWebElement,字符串(正则表达式),然后将字符串转换为Double,Int等

我真的不想更改此扩展方法,也不想避免使用多个表达式的根目录然后使用它们作为解析语句。

我已经使用https://regexr.com/来尝试找到可行的解决方案,但是没有运气,开始挣扎。

我正在将Visual Studio 2017和C#与Regex库一起使用

2 个答案:

答案 0 :(得分:1)

如果要使用单个正则表达式,则可以使用2个捕获组:

£(\d+),(\d+\.\d+) \(inc\. VAT\)

然后,您可以互相使用group1和group2来获取价值。

如果点后的小数部分只能包含两位数字,请用\d+替换最后一个\d{2}

例如:

string pattern = @"£(\d+),(\d+\.\d+) \(inc\. VAT\)";
string input = @"£24,250.00 (inc. VAT)";

foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Groups[1].Value + m.Groups[2].Value);
}

结果

24250.00

查看.NET regex demo | C# Demo

答案 1 :(得分:-1)

(?<currency>[£$€])(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2})\s\(inc\.\sVAT\)

我会这样使用sometihng。我添加了第一个带有货币的捕获组,就像我认为这可能也有用吗?您只需要添加对方括号感兴趣的货币符号。

在Visual Studio中,您:

var regex = new Regex(@"(?<currency>[£$€])(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2})\s\(inc\.\sVAT\)");

然后您执行regex.Match(data)或regex.Matches(data)或您需要做的任何事情。

然后要访问匹配项中的数字,您需要访问值组,以便... match.Groups["value"].Value其中match是您已指定为正则表达式匹配项。

只是为了快速运行正则表达式:

(?<currency>[£$€])这是一个命名捕获组,它将按字面意义捕获£$

(?<value>[0-9]{1,3}(?:,[0-9]{3})*\.[0-9]{2})这被称为捕获组以获取号码。进一步细分:

[0-9]{1,3}匹配1到3(含)次之间的0到9之间的数字。
(?:,[0-9]{3})*与用逗号分隔的数千个字符匹配0次或更多次。
\.[0-9]{2}匹配小数点和后两位。

\s\(inc\.\sVAT\)这实际上与数字后面的inc VAT位匹配。使用\s代替作为空格,因为我发现它更易于阅读。

注意:此正则表达式仅适用于此数字格式,每千个逗号带有一个逗号,并且始终包含小数点。