2016-10-28 3 views
1

Я наткнулся на следующую строку split line.split ("\ s * //") [0], но не может найти документацию по использование символа '/' в регулярных выражениях.Java regex line.split ("\ s * //")

Вот мой код:

String line = "type=path.composition id=pathComp"; 
line = line.split("\\s*//")[0]; 

Console console = System.console(); 
System.out.println("This is the line: " + line); 

Вот вывод:

This is the line: type=rule.composition id=ruleComp 

Мне интересно, что именно «/» делает с регулярным выражением, и было интересно, будет ли кто-нибудь сможет указать мне на какую-либо документацию и/или ответ, подчеркивающий, что он делает?

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

This is the line: t 

Это, однако, возникает вопрос: «что делает„//“добавить в регулярное выражение, которое видит раскол происходит в конце строки»?

Любой совет будет высоко оценен.

Z

+4

'' '' '' ничего особенного и принято буквально; можете ли вы «прочитать» '\ s * //' и посмотреть, что это значит в первую очередь? – fge

+0

Hi fge. Спасибо тебе за это. Я не уверен, что «/» будет взято буквально. Это, безусловно, позволяет прочесть линию до конца. Если я удалю возвращаемое значение, измените на «Это строка: t». Что вы подразумеваете под словом '' read '\ s * //'? – Z101

+1

Регулярное выражение '' \\ s * // "означает" две косые черты, которым предшествуют пробелы ". Так как ваша строка ввода не имеет косой черты, ** строка * не * split **, и она просто возвращается без изменений. Поскольку [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-) говорит: * Если выражение не соответствует какой-либо части ввода, тогда результирующий массив имеет только один элемент, а именно эту строку. * – Andreas

ответ

2

Рассмотрим ваш входной текст (type=rule.composition id=ruleComp), и два ваших регулярных выражений:

  • регулярное выражение 1: \s*//;
  • regex 2: \s*.

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

  • регулярное выражение не может ничего сопоставить (это то, что происходит с регулярным выражением 1): разделение эффективно не может работать, а 0-й элемент - текст ввода;
  • регулярное выражение может совпадать с пустой строкой (это то, что происходит с регулярным выражением 2): в этом случае механизм регулярных выражений замечает это и не может допустить, чтобы ситуация продолжалась, поскольку в противном случае это приведет к бесконечному циклу. Поэтому он должен продвигаться вперед одним маркером перед тем, как продолжить.

Поэтому ваши результаты:

  • с первым регулярным выражением, ничего не соответствуют;
  • со вторым регулярным выражением, пустая строка сопоставляется; движок регулярных выражений выбирает сдвиг одного символа и считает «отброшенный» текст (предыдущий токен) в качестве 0-го совпадения.
+1

Точнее, второе регулярное выражение вернет этот массив: 'new String [] {" t "," y "," p " , "e", "=", "p", "a", "t", "h", ".", "c", "o", "m", "p", "o", " s "," i "," t "," i "," o "," n "," "," i "," d "," = "," p "," a "," t " «h», «C», «o», «m», «p»} ' – Andreas

+0

@ Действительно, Я был слишком ленив, чтобы полностью развернуть :) – fge

+0

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

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