使用Java中的正则表达式从字符串中删除单词的所有独立出现

时间:2012-02-23 08:42:09

标签: java regex

需要有关如何替换子字符串的建议,例如: @sometext ,但不能替换“@ someothertext@somemail.com”子字符串。

例如,当我有一个类似的字符串:

使用@sometext以及“@ someothertext @ somemail.com”的示例sometextafter

结果,在替换上面字符串中的子字符串之后应该如下所示:

与“@ someothertext @ somemail.com”同时使用

的例子

从字段中获取字符串后,我正在使用:

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

然后我将此字符串设置为字段。

7 个答案:

答案 0 :(得分:1)

如果要替换的标签前后总是有空格,这可能就足够了。

/\s(@\w+)\s/g

答案 1 :(得分:1)

这应该符合您的需求:

str = str.replaceAll("@\w+[^@]", "");

答案 2 :(得分:1)

试试这个

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

here on Regexr

匹配@,但前提是\w之前没有字符(?<!\w)。然后匹配不是@而不是空格\s的字符序列,但前提是它后面没有非空格\S

(?<!\w)称为negative lookbehind assertion

[^@\s]被称为negated character class,意味着匹配任何不属于该类的内容

(?!\S)negative lookahead assertion

答案 3 :(得分:1)

如果“@sometext”位于句子的开头或结尾,则只需在“@sometext”之前和之后添加空格即可。但是,只是添加模式检查开始或结束句子也不会起作用,因为当你在句子的开头匹配“@sometext”并留下空格“”时,这将使得结果字符串看起来很奇怪。句子的结尾也一样。

我们需要将正则表达式替换为两个动作,并执行两个单独的正则表达式替换:

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

^表示行首,$表示行尾。

编辑:添加了几个@ sometext之后的角落案例处理。

答案 4 :(得分:1)

(c#,regex)

//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);

答案 5 :(得分:1)

你可以通过这种方式对独立的事件进行正则表达式

\b@sometext\b

将\ b放在@sometext的前面和后面将确保它是一个独立的单词,而不是像@ someothertext @ sometext.com这样的另一个单词的一部分。然后,如果发现结果将被放入$ match中,现在你可以用$ match

做任何你想做的事

希望这有帮助

  

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

     

模式中的\ b表示单词边界,因此只有不同的单词边界   *单词“web”匹配,而不是像“webbing”或“cobweb”这样的单词部分

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

^ PHP示例,但你明白了

答案 6 :(得分:0)

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

如果@hello是一个单词,那么它前后都有空格,对吧?所以你应该找到前后空间的所有@hello,并用空格替换它。

如果您不仅要删除@hello以及所有以@开头并且不包含其他@的字词,请使用以下字符:

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

[^@]是除@之外的任何符号。 +?表示匹配至少一个字符,直到到达第一个空格。

如果您要删除仅包含字母数字字符的字词,请使用\\w代替[^@]

编辑:

是的,奥哈尔是对的。要使它在字符串的开头和结尾匹配,请使用以下模式:

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

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