我想要找到以特定字符开头的单词,例如:
Lorem ipsum #text Second lorem ipsum. How #are You. It's ok. Done. Something #else now.
我需要获取所有以“#”开头的单词,所以我的期望结果是 #text、#are 和 #else。
有什么好的想法吗?
搜索:
尝试这个:
/(?<!\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
\B\#\w+
。 - Dmitry Shvedov尝试这个#(\S+)\s?
()
捕获组1的原因。 - Peter#
在单词中间呢?比如abc#de
。 - vyrp匹配以空格或行首开始的以#开头的单词。根据您的用途,最后一个单词边界并不是必要的。
/(?:^|\s)\#(\w+)\b/
括号将会把你的单词捕获到一个组中。现在,如何应用这个正则表达式取决于语言。
(?:...)
是一个非捕获组。
/\$(\w)+/g
用于搜索以 $
开头的单词。/#(\w)+/g
用于搜索以 #
开头的单词。/(?<!\w)#\w+/
给出了 Mark Bayers 的结果,但在 RegExr.com
网站上会出现以下警告。"(?<!" The "negative lookbehind" feature may not be supported in all browsers.
(?!\w)@\w+
来解决,方法是删除>
。'~(?<!\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
替换为 Cyrillic
或 Phoenician
。
上面的示例不适用于“RTL”脚本。
\B\#\w+
单词边界,后跟字符,后跟一个或多个单词字符。