2010-07-19 2 views
2

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

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

в

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

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

Спасибо!

+0

Он может быстро получить сложно: будет * "a, (, c,), search: (1, 2, 3), d" * - допустимый ввод, например? – SyntaxT3rr0r

+0

Я проверяю содержимое поиска, разделив его на его составные части. Я ошибаюсь на стороне отказа от вещей, поэтому я хотел бы, чтобы приведенная выше строка была разделена на [a] [(, c,)] [поиск: (1, 2, 3)] [d]. Тогда я просто заметил в другом месте, что (, c) не является допустимым термином и отклоняет общий поиск. – Jack

ответ

2

Это не полный регулярное выражение, но это будет вам там:

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

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

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

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

+0

+1, но так как он не хочет ни совпадений, ни совпадений с нулевой шириной, это будет ближе: '(?: \ ([^)] * \) | [^, \ S])' ([demo] (http: //regex101.com/r/yJ0jB2)) :) – zx81

1

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

Мы можем решить эту проблему с красиво простым регулярным выражением:

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

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

Эта программа показывает, как использовать регулярные выражения (см результаты в нижней части online demo):

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 

Reference

How to match (or replace) a pattern except in situations s1, s2, s3...

Смежные вопросы