2013-06-21 4 views
1

Я использую это программное обеспечение, dk-brics-automaton, чтобы получить количество состояний регулярных выражений. Теперь, например, у меня есть этот тип RE:пробел в регулярном выражении

^SEARCH\s+[^\n]{10} 

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

RegExp r = new RegExp("^SEARCH\s+[^\n]{10}", ALL); 

где ALL определенный флаг

, когда я использую двойные обратные косые черты перед малыми s, тогда компилятор принимает его как строку, где здесь \ s означает пробел, но я смущен, когда буду использовать двойные обратные косые черты , тогда он рассмотрит только обратную косую черту и "s" где я имел в виду пробел.

Теперь у меня есть тысячи таких регулярных выражений, для которых я хочу вычислить конечный автомат . Это значит, что я должен добавить вручную обратные косые черты во всех RE?

Вот ссылка, где они объяснили что-то связанное с этим, но я не получаю это:

http://www.brics.dk/automaton/doc/index.html

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

+0

Почему бы вам просто не проверить его, если '\\ s' означает пробелы? – stema

ответ

1

У меня был другой взгляд на эту документацию. «automaton» - это пакет java, поэтому я думаю, что вы должны относиться к ним как к регулярным выражениям java. Так что просто удвоить каждую обратную косую черту внутри регулярного выражения.

Дело в том, что Java не знает «сырые» строки. Таким образом, вам нужно бежать за двумя уровнями. Первый уровень, который оценивает escape-последовательности, представляет собой строковый уровень.

Строка не знает escape-последовательности \s, то есть ошибки. \n в порядке, строка оценивает его и вместо двух символов \ (0x5C) и n (0x6E) персонажа 0x0A.

Затем строка сохраняется и передается конструктору регулярных выражений. Здесь происходит следующий раунд оценки escape-последовательности.

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

+0

Я также думаю, что это должно быть так, но я пробовал этот код, и он возвращал false, что означает отсутствие соответствия RegExp r = new RegExp ("ab \\ s"); Automaton a = r.toAutomaton(); RunAutomaton ab = новый RunAutomaton (a); System.out.println (ab.newMatcher ("ab") .find()); – Xara

+0

Еще одна странная вещь, когда я даю «RegExp» в качестве аргумента, тогда она принимает это как пробел. – Xara

+0

Вы видели их [FAQ] (http://www.brics.dk/automaton/faq.html)? Кажется, что их регулярные выражения не имеют особого отношения к Java regex.Документации мало, и я не могу найти ничего о предопределенных классах, таких как '\ s'. Может быть, они не поддерживают их? – stema