Исключить строки в скобках из регулярного выражения? - PullRequest
2 голосов
/ 20 июля 2010

Я хочу разбить строки, разделенные пробелом, на ряд поисковых терминов. Однако при этом я хотел бы игнорировать пробелы в скобках. Например, я хотел бы иметь возможность разбить строку

a, b, c, search:(1, 2, 3), d

в

[[a] [b] [c] [search:(1, 2, 3)] [d]]

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Это не полное регулярное выражение, но оно вас туда доставит:

(\([^)]*\)|\S)*

При этом используется общий трюк, который обрабатывает одну длинную строку символов, как если бы это был один символ. Справа мы сопоставляем непробельные символы с \S. С левой стороны мы сопоставляем сбалансированный набор скобок с чем-либо между ними.

Конечным результатом является то, что сбалансированный набор скобок обрабатывается, как если бы это был один символ, и поэтому регулярное выражение в целом соответствует одному слову, где слово может содержать эти группы в скобках.

(Обратите внимание, что поскольку это регулярное выражение, оно не может обрабатывать вложенные скобки. Один набор скобок - это ограничение.)

1 голос
/ 16 июня 2014

У этой проблемы было другое решение, которое не было упомянуто, поэтому я опубликую его здесь для завершения.Эта ситуация похожа на этот вопрос, чтобы ["сопоставить регулярное выражение с шаблоном, исключая ..."] [4]

Мы можем решить это с помощью простого простого выражения:

\([^)]*\)|(\s*,\s*)

Левая сторона чередования | соответствует завершению (parentheses).Мы будем игнорировать эти матчи.Правая сторона сопоставляет запятые и окружающие пробелы с группой 1, и мы знаем, что они являются правильными апострофами, потому что они не совпадают с выражением слева.Мы заменим эти запятые чем-то отличительным, а затем разделим.

Эта программа показывает, как использовать регулярные выражения (см. Результаты внизу онлайн-демонстрации ):

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "a, b, c, search:(1, 2, 3), d";
Pattern regex = Pattern.compile("\\([^)]*\\)|(\\s*,\\s*)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program

Ссылка

Как сопоставить (или заменить) шаблон, кроме ситуаций s1, s2, s3 ...

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