使用Regex,我需要在字符串中找到以特定字符开头的单词。该单词必须是字母数字,但可以在单词中包含下划线(_)。在这个词的开头和结尾用下划线是不可接受的。
例如,我有以下字符串。
@ word1消息@@ message @ message @ word2_ message @ word#3 @ _word4 mesagge @ word_5
结果应为:
@ word1 @ word_5
感谢。
答案 0 :(得分:2)
使用正则表达式
(?:^|(?<=\s))@(?!_)\w+(?<!_)(?:(?=\s)|$)
或
(?:^|(?<=\W))@(?!_)\w+(?<!_)(?:(?=\W)|$)
取决于你需要/希望面前/后面......
例如@word1
中的@word_5 @word1. @word#2 @word*3
应该匹配,将点.
视为分隔符或句子结尾。
答案 1 :(得分:1)
这样做 - 边界(第1行和第3行)相当重,因为\b
这个词边界在这里不起作用,因为你不想匹配&#34; @ word#3&#34;,&#34;#&#34; &#34; d&#34;触发一个单词边界。
(?<=\s|^)
@(?!_)\w+(?<!_)
(?=\s|$)
答案 2 :(得分:1)
这个正则表达式会做到!
(?<=(^|\s))@([a-zA-Z0-9]{1}\w*[a-zA-Z0-9]|[a-zA-Z0-9]{1})(?=(\s|$))
它也匹配单个字母