2016-11-22 6 views
0

Я практикую MapReduce с Cloudera turotial here. Однако, в настоящее время руководство предназначено только разделить слова пробелом с этим регулярное выражение в Java:Как отделить слово запятой, пробелом, периодом (.), Tab ( t), скобками(), скобками [] и фигурными фигурными скобками ({}) символов в wordcount hadoop?

private static final Pattern WORD_BOUNDARY = Pattern.compile("\\s*\\b\\s*");

Однако, в дополнение к пространству "\\s*", я также хочу, чтобы определить отдельные слова через запятую, период и вкладки ((.) \ t), скобки(), скобки [] и фигурные фигурные скобки ({}). Другими словами, я определяю слово как строку, которая имеет один или несколько буквенно-цифровых символов, ограниченных двумя не буквенно-цифровыми символами. Например:

  • (cece54) имеет одно слово "cece54" ограниченный ()
  • {DWD] имеет одно слово "МСГ" ограниченная {]
  • ххх) имеет одно слово "ххх" связаны <space> и )
  • и так далее.

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

ответ

2

Если определить слово как один или несколько последовательных алфавитно-цифровых символов, затем разделить на один или несколько последовательных не-буквенно-цифровых символов, то есть "\\P{Alnum}+" или "[^a-zA-Z0-9]+".

См., Например, regex101.

Вы можете прикрепить первый номер (?U), то есть "(?U)\\P{Alnum}+", для полной поддержки международного юникода.

+0

Большое вам спасибо, это работает как шарм! Вы сохраняете мою благодарность! Будьте здоровы. – weefwefwqg3

0

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

"\\s*\\b(\\s*|\t*|\{*|\}*)" и так далее

Java-документы для шаблона являются here

+0

Благодарим за самую быструю помощь, но java вернула ошибку с вашим кодом. MyWordCount.java:83: ошибка: незаконный escape-символ \t static String regex = "\\ s * \\ b (\\ s * | \ t * | \ {* | \} *)"; \t^ MyWordCount.java:83: ошибка: незаконный escape-символ \t static String regex = "\\ s * \\ b (\\ s * | \ t * | \ {* | \} *)"; – weefwefwqg3

0

Все разделители могут быть разделены | pipe, и он может быть непосредственно разделен на использование метода split класса Java String. Пример для ссылки - http://www.tutorialspoint.com/compile_java_online.php?PID=0Bw_CjBb95KQMOV8zUmpnZUlXZTQ. Это было бы просто, а не определять шаблон.

Я добавил, что осталось несколько оставшихся при необходимости.

  String str = "Hello World{!]as"; 
     String splits[] = str.split(" |\\[|\\]|\\{"); 
     for (String split: splits) { 
      System.out.println(split); 
     } 
+1

Не было бы проще (и лучше) использовать класс символов, например. '[\\ [\\] {]'? – Andreas

+0

ли вы ссылаетесь на создание класса массива символов для всех разделителей? – Nagappan

+0

Я имел в виду, что вы создали 4-стороннее [чередование] (http://www.regular-expressions.info/alternation.html) ('|') четырех односимвольных выражений вместо одного [символьного класса] (http://www.regular-expressions.info/charclass.html) ('[]') с 4 символами , Я ничего не говорил о массивах или какой-либо другой конструкции Java, это все о конструкциях регулярных выражений. – Andreas