Простое регулярное выражение в скобках - PullRequest
0 голосов
/ 25 июня 2018

Извините за то, что я нуб, но я искал форумы часами, но не повезло, так что огромное спасибо, если вы можете помочь.

Я использую Tasker, который, как мне кажется, использует Java-выражение регулярных выражений.

У меня есть случайные данные, например: blah blah blah 6521 (3.2g) 345 (8g) 34 etc...

Между скобками всегда есть только одна цифра или одна цифра, за которой следует одна десятичная цифра, при этом ( и g) всегда постоянны, мне просто нужно извлечь числа вроде:

3.2 & 8 в их массив, что сделает Tasker.

То, что я думаю, должно работать, не работает должным образом:

\ d + \ d + |. \ D +

Он производит все числа вместо тех, которые находятся между ( и g)

Есть какие-нибудь указатели?

Очень ценит все!

EDIT: опечаток

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Пока, кроме сотен, которые я пробовал, все очень добрые предложения на этой странице создали все числа 6521 3.2 345 8 34 из строки данных, а не только числа между ( и g), которыеприведет только к 3.2 & 8

\d+.\d+|\d+

\d+(\.\d)?

\d+(\.\d+)?

\d+\.\d+|\d+

("(\\d+).(\\d+)|(\\d+)")

(\\d+).(\\d+)|(\\d+)

Возможно, это, к сожалению, невозможно, или, может быть, хотя я всегда считал, что это очень продвинуто, Tasker что-то не нравится в этом.

Если кто-нибудь из волшебников Regex захочет получить 30-секундный крэк, я буду бесконечно благодарен.

Еще раз спасибо!

0 голосов
/ 25 июня 2018

Вот пример того, как вы можете сделать это:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*; 

public class YourClass {
    public static void main(String args[]) {
        /* Create a list to store the result */
        List<String> allMatches = new ArrayList<String>();
        Matcher m = Pattern.compile("(\\d+).(\\d+)|(\\d+)").matcher("(3.2g) (8g)");

        /* Add the results to list */
        while (m.find()) {
           allMatches.add(m.group());
        }

        /* Print out the result */
        for(int i=0; i< allMatches.size(); i++) {
            System.out.print(allMatches.get(i)+" ");
        }

    }
}

Вы можете заменить (3.2g) (8g) на ваше значение String. При необходимости вы также можете привести список в массив.

0 голосов
/ 25 июня 2018

Для сопоставления чисел используйте цифру (ы), за которой следуют необязательные точка, затем цифра (цифры), перед которыми стоит открывающая скобка:

(?<=\()\d+(\.\d+)?(?=g\))

Выражение (?<=\() представляет собой оглянуться назад и означает, что предыдущий символ должен быть (, но не использует его как часть совпадения.

Аналогично, (?=g\)) утверждает, что следующие символы - g).Возможно, вам не нужен (?=g\)), но это затягивает матч.

0 голосов
/ 25 июня 2018

Пожалуйста, попробуйте следующий шаблон: (?<=\()\d+\.?\d?(?=g\))

Демоверсия

...