RegEx для захвата чисел в скобках - PullRequest
2 голосов
/ 30 мая 2019

Пример

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

Я хочу получить 15.7 от Alarm Level 1 и -12.7 от Alarm Level 2. Я пытался использовать \((.*?)\), но он получал D1 и 15.7 in Alarm Level 1.

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Здесь мы можем попытаться просто собрать цифры, используя простую группу захвата:

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

TEST

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 Circuit

jex.im визуализирует регулярные выражения:

enter image description here

2 голосов
/ 30 мая 2019

Самый простой способ справиться с этим, вероятно, будет соответствовать следующему шаблону:

\[[^(]+\((-?\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 голос
/ 30 мая 2019

Использование регулярного выражения с шаблоном:

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

Для сопоставления либо «[Low (15.7)]», либо «[High (-12.7)]» путем сопоставления

a. "[" & "]" для соответствия квадратной скобке

b. "\ w +" для соответствия одному или нескольким словам (в данном случае "Low" или "High")

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...