C#:改进了我失败的正则表达式

时间:2015-11-13 10:28:05

标签: c# regex

我有一个包含五个值的数组:

    "-360°"
    "0 x"
    "1r"
    "0,01 m/s"
    "0,01 m/s²"

我想提取所有与单位相关的字符串。

我有这个正则表达式:

    Regex regex = new Regex(@"([\-0-9\.\,0-90-9]+)(\s*)([°\w])");

但是用m / s和m /s²,我无法提取它们。

你能帮帮我吗?

此致

4 个答案:

答案 0 :(得分:1)

问题是\w不包含/。你可以加入你的正则表达式。

 Regex regex = new Regex(@"([\-0-9\.\,0-90-9]+)(\s*)([°\w\/²]*)");

或更基本

 Regex regex = new Regex(@"([\-0-9\.\,0-90-9]+)(\s*)([^""]*)");

答案 1 :(得分:0)

Regex regex = new Regex(@"([\-0-9\.\,0-90-9]+)(\s*)([°\w\/²])");

答案 2 :(得分:0)

除了其他答案,您还可以将正则表达式降低到:

Regex regex = new Regex(@"[-0-9.,]+\s*([°\w/²]*)");

答案 3 :(得分:0)

您拥有的正则表达式包含一个基本问题:您希望使用字符类匹配整数或浮点数。 [\-0-9\.\,0-90-9]匹配1个字符,-0-9., 1次或多次。你真的需要(-?\d*,?\d+)来匹配这样的数字。

由于您需要匹配上标或下标字符,因此您可以使用相应的范围[\u2070-\u209F\u00B9\u00B2\u00B3]source)。

这是一个更新的正则表达式,可以匹配⁰,¹,²,³,⁴,⁵,⁶,⁷,⁸,⁹,ⁿ等。

(-?\d*,?\d+)(\s*)([°\w](?:/[\w\u2070-\u209F\u00B9\u00B2\u00B3]+)?)

请参阅regex demo

这是C# demo

var lines = new string[] {"-360°", "0 x", "1r", "0,01 m/s", "0,01 m/s²"};
foreach (var s in lines) 
{
    var matches = Regex.Matches(s, @"(-?\d*,?\d+)(\s*)([°\w](?:/[\w\u2070-\u209F\u00B9\u00B2\u00B3]+)?)");
    foreach (Match m in matches) {
        Console.WriteLine("Match:" + m.Value);
        Console.WriteLine("Group[1]: " + m.Groups[1].Value);
        Console.WriteLine("Group[2]: " + m.Groups[2].Value);
        Console.WriteLine("Group[3]: " + m.Groups[3].Value);
    }
}