Регулярное выражение, значение между кавычками - PullRequest
0 голосов
/ 24 марта 2011

У меня небольшие проблемы с созданием регулярного выражения с использованием Java.

Ограничение: мне нужно разделить строку, разделенную! Две строки будут заключены в двойные кавычки. Например:

"value"!"value"

Если я выполнил java split () в приведенной выше строке, я хочу получить:

value
value

Тем не менее, значение catch может быть любым символом / пунктуацией / числовым символом / пробелами / и т.д.

Итак, вот более конкретный пример. Входные данные:

""he! "l0"!"wor!"d1"

Java split () должна вернуть:

"he! "l0
wor!"d1

Любая помощь очень ценится. Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Попробуйте это выражение: (".*")\s*!\s*(".*")

Хотя оно не будет работать с split, оно должно работать с Pattern и Matcher и возвращать 2 строки в виде групп.

String input = "\"  \"he\"\"\"\"! \"l0\" ! \"wor!\"d1\"";
Pattern p = Pattern.compile("(\".*\")\\s*!\\s*(\".*\")");
Matcher m = p.matcher(input);
if(m.matches())
{
  String s1 = m.group(1); //"  "he""""! "l0"
  String s2 = m.group(2); //"wor!"d1"
}

Редактировать:

Это не будет работать для всех случаев, например, "he"!"llo" ! "w" ! "orld" приведет к неправильным группам.В этом случае было бы очень трудно определить, какой!должен быть разделителем.Вот почему часто редко используемые символы используются для разделения частей строки, например @ в адресах электронной почты:)

2 голосов
/ 24 марта 2011

имеют значение, разделенное на "!"вместо!

String REGEX = "\"!\"";

String INPUT = "\"\"he! \"l0\"!\"wor!\"d1\"";

String[] items = p.split(INPUT);
1 голос
/ 24 марта 2011

Такое чувство, что вам нужно разобрать:

DOUBLEQUOTE = "
OTHER = anything that isn't a double quote
EXCLAMATION = !
ITEM = (DOUBLEQUOTE (OTHER | (DOUBLEQUOTE OTHER DOUBLEQUOTE))* DOUBLEQUOTE
LINE = ITEM (EXCLAMATION ITEM)*

Такое ощущение, что можно создать регулярное выражение для вышеперечисленного (при условии, что двойные кавычки в ITEM не могут быть вложены еще дальше), НО, возможно, лучше использовать очень простой грамматик.

Это может сработать ... исключая пропущенные побеги и тому подобное

^"([^"]*|"[^"]*")*"(!"([^"]*|"[^"]*")*")*$

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

resultList = []
while(string matches \^"([^"]*|"[^"]*")*(.*)$" => match(1)) {
    resultList += match
    string = match(2)
    if(string.beginsWith("!")) {
        string = string[1:end]
    } elseif(string.length > 0) {
        // throw an error, since there was no exclamation and the string isn't done
    }
}
if(string.length > 0) {
    // throw an exception since the string isn't done
}
resultsList == the list of items in the string

РЕДАКТИРОВАТЬ: Я понял, что мой ответ на самом деле не работает. Вы можете использовать двойные кавычки внутри строк, а также восклицательные знаки. Таким образом, вы действительно не можете иметь "!" внутри одной из струн. Таким образом, идея 1) снять кавычки с концов, 2) разделить на «!» Действительно правильный путь.

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