Как разделить слово запятой, пробелом, точкой (.), табуляцией (\ t), круглыми скобками (), квадратными скобками [] и фигурными скобками ({}) в wordcount hadoop?

Я практикую MapReduce с Cloudera turotial здесь. Однако в настоящее время учебник разделяет слова только пробелом с помощью этого регулярного выражения в Java:

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

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

  • (cece54) содержит одно слово "cece54", ограниченное ()
  • {dwd] содержит одно слово "dwd", ограниченное {]
  • xxx) содержит одно слово «xxx», связанное <space> и )
  • так далее и так далее.

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


person weefwefwqg3    schedule 22.11.2016    source источник


Ответы (3)


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

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

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

person Andreas    schedule 22.11.2016
comment
Большое спасибо, это работает как шарм! Ты спасаешь мою благодарность! Будьте здоровы. - person weefwefwqg3; 22.11.2016

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

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

Документы Java для шаблона находятся здесь

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

Все разделители могут быть разделены символом | символ трубы, и его можно напрямую разделить, используя метод разделения класса Java String. Это было бы просто вместо определения шаблона.

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

 String str = "Hello World{!]as";
 String splits[] = str.split(" |\\[|\\]|\\{");
 for (String split: splits) {
     System.out.println(split);
 }
person Nagappan    schedule 22.11.2016
comment
Не было бы проще (и лучше) использовать класс символов, например. [ \\[\\]{]? - person Andreas; 22.11.2016
comment
имеете ли вы в виду создание класса массива символов для всех разделителей? - person Nagappan; 22.11.2016
comment
Я имел в виду, что вы создали 4-стороннее чередование (|) выражения из 4 одиночных -символьные выражения вместо одного символьного класса ([]) с 4 символами. Я ничего не говорил о массивах или любых других конструкциях Java, все было о конструкциях регулярных выражений. - person Andreas; 22.11.2016
comment
Спасибо за разъяснение чередования и класса персонажа. Я перепутал его с классом символов java. - person Nagappan; 23.11.2016