Регулярное выражение - Java - PullRequest
2 голосов
/ 06 марта 2012

Для строкового значения "ABCD_12" (включая кавычки) я хотел бы извлечь только содержимое и исключить двойные кавычки, т.е. ABCD_12.Мой код:

private static void checkRegex()
{
    final Pattern stringPattern = Pattern.compile("\"([a-zA-Z_0-9])+\"");
    Matcher findMatches = stringPattern.matcher("\"ABC_12\"");
    if (findMatches.matches())
        System.out.println("Match found" + findMatches.group(0));
}

Теперь я попытался сделать findMatches.group(1);, но это возвращает только последний символ в строке (я не понимаю, почему!).

Как извлечь только содержимое, исключив двойные кавычки?

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

Попробуйте это регулярное выражение:

Pattern.compile("\"([a-zA-Z_0-9]+)\"");

ИЛИ

Pattern.compile("\"([^\"]+)\"");

Проблема в вашем коде - неуместное + за пределами правой круглой скобки. Что заставляет группу захвата захватывать только 1 символ (поскольку + находится снаружи), и поэтому в конечном итоге вы получите только последний символ.

1 голос
/ 06 марта 2012

Если в вашем шаблоне есть строго любой текст между двойными кавычками, то вам лучше использовать подстроку:

String str = "\"ABC_12\"";
System.out.println(str.substring(1, str.lastIndexOf('\"')));

Предполагая, что это немного сложнее (двойные кавычки между большей строкой),Вы можете использовать функцию split () в классе Pattern и использовать \ "в качестве регулярного выражения - это разделит строку вокруг \", чтобы вы могли легко извлечь нужный контент

Pattern p = Pattern.compile("\"");
    // Split input with the pattern
    String[] result = 
             p.split(str);
    for (int i=0; i<result.length; i++)
        System.out.println(result[i]);
    }

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#split%28java.lang.CharSequence%29

1 голос
/ 06 марта 2012

Вы должны изменить свой шаблон на это:

final Pattern stringPattern = Pattern.compile("\"([a-zA-Z_0-9]+)\"");

Обратите внимание, что знак + был перемещен внутри группы, так как вы хотите, чтобы повторение символов было частью группы. В коде, который вы разместили, на самом деле вы искали повторение группы, которое состояло из одного символа [a-zA-Z_0-9].

.
1 голос
/ 06 марта 2012

Хороший простой (читай: без регулярных выражений) способ сделать это:

String myString = "\"ABC_12\"";
String myFilteredString = myString.replaceAll("\"", "");
System.out.println(myFilteredString);

получает вас

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