Найти тире "-" внутри круглых скобок "()" внутри строки - PullRequest
3 голосов
/ 15 мая 2019

Я пытаюсь найти / определить, содержит ли строка символ "-", который не заключен в круглые скобки "()".

Я пробовал регулярное выражение [^\(]*-[^\)]*, но это не работает.

Примеры:

  1. 100 - 200 mg -> должно совпадать, потому что "-" не заключено в круглые скобки.
  2. 100 (+/-) units -> НЕ должно совпадать

Ответы [ 5 ]

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

Вы должны использовать регулярные выражения? Вы можете попробовать перебрать строку и отследить область видимости следующим образом:

public boolean HasScopedDash(String str)
{
    int scope = 0;
    boolean foundInScope = false;
    for (int i = 0; i < str.length(); i++)
    {
        char c = str.charAt(i);
        if (c == '(')
            scope++;
        else if (c == '-')
            foundInScope = scope != 0;
        else if (c == ')' && scope > 0)
        {
            if (foundInScope)
                return true;
            scope--;
        }
    }
    return false;
}

Редактировать: Как уже упоминалось в комментариях, может быть желательно исключить случаи, когда черточка идет после открывающей скобки, но закрывающей скобки никогда не следует. (Т.е. "abc (2-xyz") Приведенный выше отредактированный код объясняет это.

1 голос
/ 15 мая 2019
Matcher m = Pattern.compile("\\([^()-]*-[^()]*\\)").matcher(s); return !m.find();

https://ideone.com/YXvuem

1 голос
/ 15 мая 2019

Java поддерживает количественные атомные группы, это работает.
Как это работает - использовать парные скобки и их содержимое,
и ничего не возвращать, пока не найдет тире -.
Это делается с помощью атомной группы конструкций (?> ).

^(?>(?>\(.*?\))|[^-])*?-

https://www.regexplanet.com/share/index.html?share=yyyyd8n1dar
(нажмите кнопку Java, проверьте столбец функции find())

Чтение

 ^ 
 (?>
      (?> \( .*? \) )
   |  
      [^-] 
 )*?
 -
0 голосов
/ 15 мая 2019

Если вы не против проверить строку, используя 2 регулярных выражения вместо 1 сложного регулярного выражения.Вы можете попробовать это вместо

public static boolean match(String input) {
    Pattern p1 = Pattern.compile("\\-"); // match dash
    Pattern p2 = Pattern.compile("\\(.*\\-.*\\)"); // match dash within bracket

    Matcher m1 = p1.matcher(input);
    Matcher m2 = p2.matcher(input);

    if ( m1.find() && !m2.find() ) {
        return true;
    } else {
        return false;
    }
}

Проверить строку

public static void main(String[] args) {
    String input1 = "100 - 200 mg";
    String input2 = "100 (+/-) units";
    System.out.println(input1 + " : " + ( match(input1) ? "match" : "not match") );
    System.out.println(input2 + " : " + ( match(input2) ? "match" : "not match") );
}

Вывод будет

100 - 200 mg : match
100 (+/-) units : not match
0 голосов
/ 15 мая 2019

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

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

Он пропускает ваш первый ввод и завершает работунежелательный ввод.Вы можете просто добавить другие символы в его список средних символов, используя логические ИЛИ.

Демо

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...