Удаление всех автономных вхождений слова из строки с регулярными выражениями в Java - PullRequest
2 голосов
/ 23 февраля 2012

Нужен совет о том, как заменить подстроку, например: @ sometext , но не заменять "@ someothertext@somemail.com" подстрока.

Например, когда у меня есть строка, например:

Пример с @sometext, а также с "@ someothertext @ somemail.com" sometextafter

Ирезультат после замены подстрок в строке выше должен выглядеть следующим образом:

Пример с, а также с "@ someothertext @ somemail.com" sometextafter

После получениястрока из поля, я использую:

String textMod = someText.replaceAll("( |^)[^\"]@[^@]+?( |$)","");
someText = textMod + "@\"" + someone.getEmail() + "\" ";

А затем я устанавливаю эту строку в поле.

Ответы [ 7 ]

1 голос
/ 23 февраля 2012

(c #, на основе регулярных выражений)

//match @xxx sequences, but only if i can look back and NOT see a @xxx immediately preceding me, and if I don't end with a @
string input = @"[An example with @hello and also with ""@@hello@somemail.com"" sometext @lastone";
 var pattern = @"(?<!@\w+)(?>@\w+)(?!@)";
 var matches = Regex.Matches(input, pattern);
1 голос
/ 18 марта 2016

Вы можете сделать регулярное выражение в отдельном случае таким образом

\b@sometext\b

Поместив \ b впереди и сзади @sometext, вы убедитесь, что это отдельное слово, а не часть другогослово как @ someothertext @ sometext.com.Затем, если будет обнаружено, что результат будет помещен в $ match, теперь вы можете делать все, что захотите, с $ match

Надеюсь, это поможет

С https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

\ B в шаблоне обозначает границу слова, поэтому сопоставляется только отдельное * слово «паутина», а не частичное слово, такое как «паутина» или «паутина»

if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice."))      {
    echo "A match was found.";
    }

^ Пример PHP, но вы получите точку

1 голос
/ 23 февраля 2012

Простое добавление пробелов до и после "@sometext" не будет работать, если "@sometext" находится в начале или конце предложения. Однако простое добавление проверки шаблона для начала или конца предложения также не сработает, поскольку, когда вы сопоставляете «@sometext» в начале предложения и оставляете пробел «», полученная строка выглядит странно. То же самое относится и к концу предложения.

Нам нужно разделить замену регулярного выражения на два действия и выполнить две отдельные замены регулярного выражения:

str = str.replaceAll(" @sometext ", " ");
str = str.replaceAll("^@sometext | @sometext$|(?:@sometext ){2,}", "");

^ означает начало строки, $ означает конец строки.

РЕДАКТИРОВАТЬ: Добавлена ​​обработка в угловом регистре, когда несколько @ sometext's следуют друг за другом.

1 голос
/ 23 февраля 2012

Попробуйте это

(?<!\w)@[^@\s]+(?!\S)

См. здесь на Regexr

Совпадение на @, но только если до слова нет \w до (?<!\w).Затем сопоставьте последовательность символов, которые не являются @ и не являются пробелами \s, но только если за ним не следует непробельный символ \S

(?<!\w) называется отрицательным взглядом за утверждением

[^@\s] называется отрицательным классом символов , означает совпадение с чем-либо, что не является частью класса

(?!\S) является негативным прогнозомутверждение

1 голос
/ 23 февраля 2012

Это должно соответствовать вашим потребностям:

str = str.replaceAll("@\w+[^@]", "");
1 голос
/ 23 февраля 2012

Если перед тегами и позади них всегда есть место для замены, этого может быть достаточно.

/\s(@\w+)\s/g
0 голосов
/ 23 февраля 2012

myString = myString.replaceAll(" @hello ", " ");

Если @hello - это одно слово, то в нем есть пробелы до и после, верно? Таким образом, вы должны найти все @hello с пробелом до и после и заменить его пробелом.

Если вам нужно удалить не только @hello s и все слова, начинающиеся с @ и не содержащие других @, используйте это:

myString = myString.replaceAll(" @[^@]+? ", " ");

[^@] - любой символ, кроме @. +? означает совпадение как минимум одного символа до достижения первого пробела.

Если вы хотите удалить слова только с буквенно-цифровыми символами, используйте \\w вместо [^@]

РЕДАКТИРОВАТЬ:

Да, Охаал прав. Чтобы сопоставить его в начале и конце строки, используйте этот шаблон:

( |^)@[^@]+?( |$)

myString = myString.replaceAll("( |^)@hello( |$)", " ");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...