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

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

String phrase="bob has a bike and bob's bike is red";
String word="bob";
phrase=phrase.replaceAll("\\b"+word+"\\b","");
System.out.println(phrase);

выход:
has a bike and 's bike is red

Что я хочу это
has a bike and bob's bike is red

У меня ограниченное понимание регулярных выражений, поэтому я предполагаю, что есть решение, но сейчас мне не достаточно создать регулярное выражение для обработки апострофов. Также я хотел бы, чтобы это работало с черточками, поэтому фразаthe new mail is e-mail заменит только первое появление почты.

 Jigar Joshi22 янв. 2011 г., 19:28
phrase.split("and")[1];
 qw3n22 янв. 2011 г., 20:33
@ tchrist Я качаю головой, уходя, лол. За то, что я делаю, мне не нужно беспокоиться обо всех этих возможностях. Но это выглядит как интересный вызов.
 tchrist22 янв. 2011 г., 20:16
Я бы не стал пользоваться\b в шаблонах Java: он суперский Есть способ выразить это правильно, но вряд ли это будет то, что вы хотите в любом случае.
 tchrist22 янв. 2011 г., 20:21
Вот мой тест на пытки для извлечения отдельных слов:Джеймс спросил: «Трид Рене и прадедушка и бабушка Ноэля 1970-х годов - дача, не так ли?» Не получив ответа, он покачал головой - и ушел. Как строка Java вы можете написать это"James asked, \u201C\u2019Tis Ren\u00E9e\u2019s and Noe\u0308l\u2019s great\u2010grandparents\u2019 1970's-ish summer\u2010house, t'isn\u2019t it?\u201D \u00A0 Receiving no answer, he shook his head--and walked away.", Удачи!

Ответы на вопрос(2)

\b\S*(bob|mail)\S*\b

это может соответствовать больше, чем вы хотите. Если вам нужны «префиксы» или «суффиксы» длиной не более 2 символов (это может быть"'s" или же"e-"), используйте\S{0,2} вместо\S*.

Регулярное выражение говорит:

\b           # a word boundary
\S*          # any number of non-spaces
(            # match group 1 (to enable a choice) 
  bob|mail   #   "bob" or "mail"
)            # end match group 1
\S*          # any number of non-spaces
\b           # a word boundary

Итак, на Java:

phrase = phrase.replaceAll("\\b\\S*(bob|mail)\\S*\\b", "");

Будьте осторожны с такими вещами, как

phrase = phrase.replaceAll("\\b" + word + "\\b", "");

Которые должны быть

phrase = phrase.replaceAll("\\b" + Pattern.quote(word) + "\\b", "");

так как всякий раз, когдаword содержит метасимволы регулярных выражений, ваше регулярное выражение прервется, если вы правильно неэкранировать строку заранее, используяPattern.quote().

 tchrist22 янв. 2011 г., 20:26
@ Томалак: Согласен. Одна из проблем, связанных с таким количеством вопросов, заключается в том, что они на самом деле не определяют проблему достаточно полно, чтобы найти правильное решение. Другой случай, когда они думают, что их подход к решению проблемы - это, в первую очередь, способ добиться этого.
 qw3n22 янв. 2011 г., 20:26
@ Tomalak Я упоминал в другом посте, что я удалил все не алфавитные символы, кроме' а также-, Я должен был упомянуть об этом в вопросе. Я наполовину понимаю ваш ответ, но кажется, что он соответствует чему-либо с Бобом в нем, а затем заменяет все слово. Я хочу, чтобы он заменял Боба, только если это Боб, а не Боб или Хай-Боб.
 Tomalak22 янв. 2011 г., 20:21
@tchrist: Такие вещи, как "== Боб", не были частью спецификации вопроса, поэтому я не стал их ожидать. Хороший вопрос о\b будучи сломанным, все же. Однако пока я оставлю ответ без изменений, так как он работает со случаями, которые дал ОП. Если вопрос не станет более конкретным, мне не с чем будет работать, и я не смогу улучшить свой ответ.
 Tomalak22 янв. 2011 г., 20:26
@tchrist: некоторые источники предлагают\b на самом деле Unicode-включен в Java:answers.oreilly.com/topic/... и поэтому все будет работать.
 tchrist22 янв. 2011 г., 20:15
Нет, это вводит в заблуждение. Вы не должны смешивать границы слов с такими вещами, как не-ASCIISpace. Это потому, что шаблон\b\S+bob не соответствует Строки, как"==bob", Также,\b совершенно не работает в Java, так как строка"élève" не соответствует шаблону\b\w+\b как в его полностью черезPattern.matches() но на самом деле даже вообще в любой точке этой строки, используяPattern.find()!
Решение Вопроса

что вы понимаете под словом. Возможно, вам лучше определить, что вы понимаете как разделитель слов: например, пробелы, запятые .... И написать что-то как

phrase=phrase.replaceAll("([ \\s,.;])" + Pattern.quote(word)+ "([ \\s,.;])","выход:2");

Но вам нужно будет дополнительно проверить наличие в начале и в конце строки. Например:

  String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
  String word="bob";
  phrase=phrase.replaceAll("([\\s,.;])" + Pattern.quote(word) + "([\\s,.;])","выход:2");
  System.out.println(phrase);

печатает это

bob has a bike ,  and boba bob's bike is red and "bob" stuff.

Обновление: если вы настаиваете на использовании\b, учитывая, что «граница слова» понимает Unicode, вы также можете сделать этот подвох: заменить все вхождения' по какой-то юникодовой букве, которая, как вы уверены, не появится в вашем тексте, а затем выполните обратную замену. Пример:

  String phrase="bob has a bike bob, bob and boba bob's bike is red and \"bob\" stuff.";
  String word="bob";
  phrase= phrase.replace("'","ñ").replace('"','ö');
  phrase=phrase.replaceAll("\\b" + Pattern.quote(word) + "\\b","");
  phrase= phrase.replace('ö','"').replace("ñ","'");
  System.out.println(phrase);

ОБНОВЛЕНИЕ: Подводя итог некоторым комментариям ниже: можно было бы ожидать\w а также\b иметь то же понятие, что и слово «характер», как почти каждый диалект регулярного выражения. Ну, Java не делает:\w считает ASCII,\b считает Юникод. Это ужасное несоответствие, я согласен.

Обновление 2: начиная с Java 7 (как указано в комментариях)UNICODE_CHARACTER_CLASS флаг позволяет указать согласованное поведение только в Юникоде, см., например,Вот.

 limc22 янв. 2011 г., 20:06
Возможно, вам придется добавить? а также ! знаки препинания тоже. :)
 leonbloy22 янв. 2011 г., 20:11
Что ж, «\ b», конечно, хорошо, но я не думаю, что Java позволяет вам переопределить класс «word». Еще один подвох, чтобы заменить ваш' если вы уверены, что какое-то слово не появится в фразе, примените исходное регулярное выражение и выполните обратную замену. Очень грязно, но иногда практично.
 tchrist22 янв. 2011 г., 20:33
\b являетсяпредполагаемый быть таким же, как(?:(?<=\w)(?!\w)|(?<!\w)(?=\w)) - но бездумно Ява сломала это. По аналогии,\w являетсяпредполагаемый быть[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}], Поменяйте местами одно на другое, чтобы Java могла понять, что\b на самом делепредполагаемый быть(?:(?<=\[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}ww\p{So}])(?!\[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}])|(?<!\[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}])(?=\[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}])).
 qw3n22 янв. 2011 г., 20:01
@leonbloy Ранее в программе я уже убрал все знаки препинания, кроме' а также-, Мне понравилось\b потому что он работал в начале и в конце строк, где не было бы пробелов.
 qw3n22 янв. 2011 г., 20:20
Я кратко подумал о замене чего-то для' а также-, но, несмотря на то, что он очень хакерский, я думаю, что это самое быстрое и простое решение. Спасибо за вашу помощь.

Ваш ответ на вопрос