首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文本中查找hashtag

在文本中查找hashtag
EN

Stack Overflow用户
提问于 2019-06-21 14:22:56
回答 2查看 269关注 0票数 0

是的,这里有很多标签正则表达式,但没有一个能满足我的需求。实际上,没有人能够解决这个问题。

Regex应将以下哈希标记视为有效:

代码语言:javascript
复制
#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß

无效的...and应为:

代码语言:javascript
复制
ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid

允许的字符数应为: a-Z,0-9,öÖäüuu§,_

最大长度应为50个字符。

主要的问题是hashtag被“连接”到另一个文本部分。我不知道如何解决这个问题。

这就是我想要做的

代码语言:javascript
复制
/([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})/u

这个方法运行得很好,但没有考虑到"word#hashtag“问题。

EN

回答 2

Stack Overflow用户

发布于 2019-06-21 14:26:38

我认为你的原始表达式非常棒,我们只需要修改一下:

代码语言:javascript
复制
^\s*#([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})$

Demo

测试

代码语言:javascript
复制
$re = '/^\s*#([\p{Pc}\p{N}\p{L}\p{Mn}]{1,50})$/um';
$str = '#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß

ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

输出

代码语言:javascript
复制
array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(13) "#validhashtag"
    [1]=>
    string(12) "validhashtag"
  }
  [1]=>
  array(2) {
    [0]=>
    string(14) "#valid_hashtag"
    [1]=>
    string(13) "valid_hashtag"
  }
  [2]=>
  array(2) {
    [0]=>
    string(41) " #validhashtag_with_space_before_or_after"
    [1]=>
    string(39) "validhashtag_with_space_before_or_after"
  }
  [3]=>
  array(2) {
    [0]=>
    string(35) "#valid_hashtag_chars_öÖäÄüÜß"
    [1]=>
    string(34) "valid_hashtag_chars_öÖäÄüÜß"
  }
}
票数 4
EN

Stack Overflow用户

发布于 2019-06-21 14:26:27

您可以使用以下两种方法之一:

代码语言:javascript
复制
/(?<!\S)#\w+(?!\S)/u
/(?<!\S)#[\w\p{M}\p{Pc}]+(?!\S)/u

请参阅regex demo。如果您想限制单词部分长度,请保留您的{1,50}量词- /(?<!\S)#\w{1,50}(?!\S)/u

还要注意:即使带有u修饰符的\w也不匹配在.NET、Java、Python re正则表达式中被认为是“单词”的相同字符。您可以决定包含其他类来填补空白,并使用[\w\p{M}\p{Pc}]+而不只是\w,其中\p{M}匹配任何变音符号,\p{Pc}匹配任何连接器标点符号。

详细信息

  • (?<!\S) -需要空格或字符串开头的正确before
  • # -a Unicode sign
  • \w+ - 1+单词字符(请注意,如果您想将其长度限制在1到50之间,请将替换为+ )(同时,请注意,u修饰符允许\w引擎使用Unicode匹配任何Unicode字母和数字-匹配1+单词字符+所有变音符号(\p{M})和所有连接符标点(\p{Pc},在.NET regex)
  • (?!\S)中视为单词-紧跟在后面的空格或字符串末尾。

PHP demo

代码语言:javascript
复制
$s = "#validhashtag
#valid_hashtag
 #validhashtag_with_space_before_or_after
#valid_hashtag_chars_öÖäÄüÜß
...and not valid shoulw be:

ipsum#notvalid //Not valid: Connected to Word
http://google.com/#results //Not valid: Same as above
#not-valid
#not!valid";
if (preg_match_all('~(?<!\S)#\w+(?!\S)~u', $s, $matches)) {
   print_r($matches[0]);
}

输出:

代码语言:javascript
复制
Array
(
    [0] => #validhashtag
    [1] => #valid_hashtag
    [2] => #validhashtag_with_space_before_or_after
    [3] => #valid_hashtag_chars_öÖäÄüÜß
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56697913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档