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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在字符串中匹配两个正则表达式相关的知识,希望对你有一定的参考价值。

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

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

我已成功获得最后一部分:

( \(inc\. VAT\))

另外,我可以得到£,并且:

[£,]

但我似乎无法弄清楚如何将两个表达式结合起来只返回我想要的东西。

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

理论上我可以通过我的c#代码中的两个单独的正则表达式来运行它,每个都修剪我想要的东西。但有没有办法只用一个表达式来完成它?

原因是我有一个GetConvertedExtension方法,它接受一个I​​WebElement,一个字符串(正则表达式),然后将字符串转换为Double,Int等

我真的不想改变这个扩展方法或者避免使用和删除多个表达式的根,然后是一个解析语句。

我已经使用https://regexr.com/尝试获得一个有效的解决方案但没有运气并开始挣扎。

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

答案

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

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

然后你可以使用group1和group2来获取你的价值。

如果点后的小数部分只能包含2位数,则用\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

另一答案

(?<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(数据)或regex.Matches(数据)或你需要做的任何事情。

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

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

(?<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\)这与字母数字后的增值税位相匹配。使用\s而不是作为空格,因为我觉得它更容易阅读。

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

以上是关于在字符串中匹配两个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

js正则表达式 匹配两个特定字符间的内容

JAVA正则表达式怎么匹配所有符合要求的子字符串

如何检测两个正则表达式在它们可以匹配的字符串中是不是重叠?

正则表达式的贪婪和非贪婪模式

python 正则表达式

正则表达式匹配两个特殊字符中间的内容