正则表达式用于捕获括号中的数字

时间:2019-05-30 04:08:43

标签: c# regex regex-lookarounds regex-group regex-greedy

示例

Alarm Level 1 (D1) [Low (15.7)]
Alarm Level 2 [High (-12.7)]

我想从15.7获得Alarm Level 1,从-12.7获得Alarm Level 2。我尝试使用\((.*?)\),但同时获得了D115.7 in Alarm Level 1

3 个答案:

答案 0 :(得分:2)

处理此问题最简单的方法可能是匹配以下模式:

\[[^(]+\((-?\d+(?:\.\d+)?)\)\]

此处的策略是匹配整个术语,例如[High (-12.7)],然后在圆括号内捕获数字。

例如,在Python中,我们可以尝试以下操作:

input = """Alarm Level 1 (D1) [Low (15.7)]
           Alarm Level 2 [High (-12.7)]"""

matches = re.findall(r'\[[^(]+\((-?\d+(?:\.\d+)?)\)\]', input)
print(matches)

此打印:

['15.7', '-12.7']

答案 1 :(得分:2)

在这里,我们可以尝试使用一个简单的捕获组来收集数字:

\(([0-9-.]+)\)

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\(([0-9\-\.]+)\)";
        string input = @"Alarm Level 1 (D1) [Low (15.7)]
Alarm Level 2 [High (-12.7)]";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

const regex = /\(([0-9-.]+)\)/gm;
const str = `Alarm Level 1 (D1) [Low (15.7)]
Alarm Level 2 [High (-12.7)]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

DEMO

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 2 :(得分:0)

使用正则表达式,其模式为:

  

[\ w + \ s \([\ d .-] + \)]

通过匹配来匹配“ [低(15.7)]”或“ [高(-12.7)]”

a。 “ [”&“]” 匹配方括号

b。 “ \ w +” 匹配一个或多个单词(在这种情况下为“低”或“高”)

c。 “ \ s” 匹配单个空格

d。 “ \(”&“ \)” 匹配括号

e。 [\ d .-] + 匹配数字的组合“。”。 &“-”

后跟以下模式:

  

[\ d .-] +

获取所需的值

源代码:

    static void Main(string[] args)
    {
        string input = "Alarm Level 1 (D1) [Low (-15.7)]";
        string pattern = @"\[\w+\s\([\d.-]+\)\]";
        string outputA = Regex.Match(input, pattern).Value;
        string outputB = Regex.Match(outputA, @"[\d.-]+").Value;

        Console.WriteLine("A: " + outputA);
        Console.WriteLine("B: " + outputB);

        Double intOutput = Convert.ToDouble(outputB);

        Console.ReadLine();
    }