2013-06-26 8 views
0

У меня есть следующий фрагмент кода, который разбивает строку и возвращает массив строк.Как это регулярное выражение работает на Java?

public static void main(String[] args) { 
     String name="what is going on"; 
     String[] ary = name.split(""); 
     System.out.println(Arrays.toString(ary)); 
     } 
//output: [, w, h, a, t, , i, s, , g, o, i, n, g, , o, n] 

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

public static void main(String[] args) { 
      String name="what is going on"; 
      String[] ary = name.split("(?!^)"); 
      System.out.println(Arrays.toString(ary)); 
      } //[w, h, a, t, , i, s, , g, o, i, n, g, , o, n] 

если кто-то может объяснить, что регулярное выражение ищет и, как это регулярное выражение используется для разделения, это будет очень полезно для Java начинающего сообщества. Большое спасибо

+1

HTTP: // StackOverflow. com/questions/6576625/why-is-equivalent-to – assylias

+0

У меня нет полного ответа для вас, но вот хорошая рекомендация. Что вы имеете в виду здесь, это «нулевая ширина негативного взгляда». http://www.regular-expressions.info/refadv.html –

+0

Возможно, вы захотите прочитать [anchors] (http://www.regular-expressions.info/anchors.html) и [lookarounds] (http: //www.regular-expressions.info/lookaround.html). –

ответ

4

В первом примере пустой шаблон соответствует перед каждым символом в строке. Таким образом, он соответствует перед первым символом, перед вторым и т. Д.. String.split(String) Javadoc указывает, что конечные пустые строки игнорируются, но возвращаемые строки включают в себя то, что перед первым совпадением. Итак, массив равен {"", "w", "h", ..., "n"}.

Второй пример имеет регулярное выражение, которое соответствует любому месту, кроме начала строки. (? и ) связаны взглядом. ! делает его отрицательным, а ^ означает начало строки. Более того, никакие символы фактически не потребляются регулярным выражением. Таким образом, он совпадает после первого символа, после второго и так далее. Ни один из персонажей не будет расходоваться, поэтому у вас есть:

w h a t i s g o i n g o n 
^^^^^^^^^^^^^^^^ 

Карточки здесь являются точками прорыва с пространством вверху.

+0

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

+0

Справа. Я пропустил это. Я отредактировал ответ. –

1

Он разбивает строку на подстроки и разделить его на регулярное выражение полукокса или строку: , но не ставит регулярное выражение на выходе так:

строка s1 = «разделены пробелами»; и s1.split ("\ s") [0] будет разделена s1.split ("\ s") [1] будет на и НЕ ""