以特定字符开头的单词的正则表达式

25

我想要找到以特定字符开头的单词,例如:

Lorem ipsum #text Second lorem ipsum. How #are You. It's ok. Done. Something #else now.

我需要获取所有以“#”开头的单词,所以我的期望结果是 #text、#are 和 #else。

有什么好的想法吗?


2
你在这里标记了C#和JavaScript。你想在哪里做这个? - womp
6个回答

46

搜索:

  • 某些非单词字符,然后
  • #
  • 一些单词字符

尝试这个:

/(?<!\w)#\w+/

在 C# 中,它看起来像这样:

string s = "Lorem ipsum #text Second lorem ipsum. How #are You. It's ok. Done. Something #else now.";
foreach (Match match in Regex.Matches(s, @"(?<!\w)#\w+"))
{
    Console.WriteLine(match.Value);
}

输出:

#text
#are
#else

1
啊,好发现...在#之前单词边界不起作用,是吗?但是在JavaScript中,你不能使用负回顾,对吧? - Jeff B
注意:这个断言在 Safari 中的 JavaScript 运行时不起作用,因为目前 Safari 不支持后行断言 https://caniuse.com/js-regexp-lookbehind (很快可能会改变)。 - Dmitry Shvedov
相反,你可以简单地使用单词边界:\B\#\w+ - Dmitry Shvedov

14

尝试这个#(\S+)\s?


2
这将返回 "#word" 而不是 "#word"。\s? 不是必需的。 - zincorp
@zincorp,这就是为什么有一个()捕获组1的原因。 - Peter
如果#在单词中间呢?比如abc#de - vyrp
如果我猜的话,它应该匹配 #de。 - Peter
@Peter,你知道如何确保它不匹配abc#de吗? - The concise
@Peter,你知道如何确保它不匹配abc#de吗? - The concise

4

匹配以空格或行首开始的以#开头的单词。根据您的用途,最后一个单词边界并不是必要的。

/(?:^|\s)\#(\w+)\b/

括号将会把你的单词捕获到一个组中。现在,如何应用这个正则表达式取决于语言。

(?:...)是一个非捕获组。


1
下面的代码应解决该问题。
  • /\$(\w)+/g 用于搜索以 $ 开头的单词。
  • /#(\w)+/g 用于搜索以 # 开头的单词。
答案 /(?<!\w)#\w+/ 给出了 Mark Bayers 的结果,但在 RegExr.com 网站上会出现以下警告。
"(?<!" The "negative lookbehind" feature may not be supported in all browsers.

警告可以通过将其更改为(?!\w)@\w+来解决,方法是删除>

0
为了适应不同的语言,我使用了这个(PCRE/PHP):
'~(?<!\p{Latin})#(\p{Latin}+)~u'

或者

$language = 'ex. get form value';
'~(?<!\p{' . $language . '})#(\p{' . $language . '}+)~u'

或者循环运行多个脚本

$languages = $languageArray;

$replacePattern = [];

foreach ($languages as $language) {

  $replacePattern[] = '~(?<!\p{' . $language . '})#(\p{' . $language . '}+)~u';

}

$replacement = '<html>$1</html>';

$replaceText = preg_replace($replacePattern, $replacement, $text);

\w 很好用,但据我所见,只适用于拉丁字母表。

在上面的示例中将 Latin 替换为 CyrillicPhoenician

上面的示例不适用于“RTL”脚本。


0
尝试这个:\B\#\w+ 单词边界,后跟字符,后跟一个或多个单词字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接