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

本文关键字:失败 正则表达式 | 更新日期: 2023-09-27 18:21:56

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

    "-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²,我无法提取它们。

你能帮我吗?

问候

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

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

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

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

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

查看regex演示

这是一个C#演示:

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);
    }
}

问题是'w不包括/。您可以将/包含在您的正则表达式中。

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

或者更基本上是

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

除了其他答案外,您还可以将正则表达式简化为:

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