Не могу использовать символ «-» в регулярном выражении Java, он не находит шаблон в данном тексте - PullRequest
0 голосов
/ 23 марта 2011

Я впервые использую регулярные выражения и у меня возникают некоторые проблемы.

Я пишу простую программу компиляции, и сейчас я работаю над модулем "синтаксического анализа", который занимаетстрока ассемблера и разбивает ее на части.

Некоторая часть строки может состоять из одного из этих выражений:

String comp = "[(0)(1)(-1)(D)(A)(!D)(!A)(-D)(-A)(D+1)(A+1)(D-1)(A-1)(D+A)(D-A)(A-D)(D&A)(D|A)(M)(M+1)(M-1)(D+M)(D-M)(M-D)(D&M)(D|M)]";

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

Компилятор Java не компилирует такое выражение и пишет, что:

Недопустимый диапазон символов рядом с индексом 46 [(0) (1) (- 1) (D) (А) (D), (А) (-! D) (- А) (D + 1) (А + 1) (Д-1) (А-1) (Д+ А) (DA), (AD), (D & A), (D | А) (М) (М + 1) (М-1) (Д + М) (ДМ) (MD), (D & M), (Д | М)]

Я пытался сделать это так:

    String comp = "[(0)(1)(\\-1)(D)(A)(!D)(!A)(\\-D)(\\-A)(D+1)(A+1)(D\\-1)(A\\-1)(D+A)(D\\-A)(A-D)(D&A)(D|A)(M)(M+1)(M\\-1)(D+M)(D\\-M)(M\\-D)(D&M)(D|M)]";

Это делает программу компилируемой, но она находит совпадение для строк типа "D" или "1", но не для«D + 1» или «D-1», в чем проблема и как ее исправить?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Когда вы заключаете квадратные скобки в (часть) вашего регулярного выражения, оно становится набором символов (или классом символов).Набор символов всегда соответствует только одному символу.Итак, ваше регулярное выражение:

[(0)(1)(-1)(D)(A)(!D)(!A)(-D)(-A)(D+1)(A+1)(D-1)(A-1)(D+A)(D-A)(A-D)(D&A)(D|A)(M)(M+1)(M-1)(D+M)(D-M)(M-D)(D&M)(D|M)]

соответствует только одному из:

'(', '0', ')', '1', '-', ... , '+', ...

Также обратите внимание, что метасимволы, такие как (, ) и + не имеют специального значения внутри символанаборы.Набор символов имеет свои собственные мета-символы, такие как -, который используется для обозначения диапазона.Например, [a-c] соответствует либо a, b или c.

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

Подробнее о наборах символов: http://www.regular -expressions.info / charclass.html

0 голосов
/ 23 марта 2011

Проблема заключается в том, что вы не можете использовать несколько символов внутри () внутри [] таким образом.Похоже, что строка в () превращается в отдельные символы.

public static void main(String... args) {
    test("[(C)(D1)]", "D"); // true!
    test("[(D)(D1)]", "D1");
    test("((D)|(D1))", "D1");
    test("[(D)(D+1)]", "D+1"); // false
    test("[(D)(D+1)]", "+"); // true!
    test("[(D)(D\\+1)]", "D+1");
    test("((D)|(D\\+1))", "D+1");
}

private static void test(String regex, String text) {
    Pattern pattern = Pattern.compile("^"+regex+"$");
    System.out.println(regex +" matches "+text+" is " + pattern.matcher(text).find()) ;
}

печатает

[(C)(D1)] matches D is true
[(D)(D1)] matches D1 is false
((D)|(D1)) matches D1 is true
[(D)(D+1)] matches D+1 is false
[(D)(D+1)] matches + is true
[(D)(D\+1)] matches D+1 is false
((D)|(D\+1)) matches D+1 is true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...