Regex 后标记系统中文本的适当正则表达式
我正在创建一个基本上是克隆的实践,我正在尝试实现一个标记系统,尽管我在标记名的正则表达式方面遇到了一些问题 我正试图实现StackOverflow及其标记的相同结果,即:Regex 后标记系统中文本的适当正则表达式,regex,regex-lookarounds,regex-group,Regex,Regex Lookarounds,Regex Group,我正在创建一个基本上是克隆的实践,我正在尝试实现一个标记系统,尽管我在标记名的正则表达式方面遇到了一些问题 我正试图实现StackOverflow及其标记的相同结果,即: 字母数字字符的任意组合,不区分大小写 0或1个,-或后接更多字母数字 1个标记中最多允许3个句点、破折号或下划线 这些应该返回一个正匹配: exampletag example-tag ex-ample-tag ex_ample_tag ex-ample_tag ex.am-ple_tag Ex.4m-p1e_t4g 这
- 字母数字字符的任意组合,不区分大小写
- 0或1个
,
或-
后接更多字母数字 - 1个标记中最多允许3个句点、破折号或下划线
exampletag
example-tag
ex-ample-tag
ex_ample_tag
ex-ample_tag
ex.am-ple_tag
Ex.4m-p1e_t4g
这些应该返回一个负数,为了回答这个问题,假设空白意味着一个新标签的开始,并且可以安全地忽略掉
ex-am-pl-et-ag // and variations where there's more than 3 `-` `_` or `.`
-exampletag // no starting symbols
exampletag- // no trailing symbols
我目前在正则表达式中停留在这一点上,我不确定如何更好/更进一步地表述它
((\w+)(\-\ \u124\)\ 1?
用我的推理
(将#2和#3的序列捕获到捕获组#1中
(捕获组#2
\w+一个或多个字母数字
)
(捕获组#3)
\-|\_|\.————或。
)?0个或1个以上值
)
\1? 捕获组#1的0或1
不过,\1
部分的工作方式与我预期的不太一样。这将匹配类似于example-
的内容,但是tag
部分将是第二个热门内容,我一直在讨论如何从这里开始
最好我希望这个正则表达式与正则表达式的Ruby风格一起工作,但不管是什么风格,它都很好。注意
\w
匹配字母、数字和下划线。因此,在模式中使用\w
时,检查下划线的数量永远不会准确。此外,您的模式只需匹配一个或多个单词字符的序列,后跟可选的-
、
或
,然后\1?
尝试有选择地匹配当前位置右侧组1中捕获的相同值
我建议将所有\w
更改为[^\w\uu]
以从\w
中排除(减去)\ucode>,这是一个类似a(?:ba){0,3}
的构造,用于匹配元素分隔的项,并至少使用锚定、^
和$
来匹配字符串的开头和结尾
你可以用
^[^\W_]+(?:[-.][^\W_]+){0,3}$
在Ruby中,它必须写成
\A[^\W_]+(?:[-.][^\W_]+){0,3}\z
细节
\A
-字符串的开头
[^\W_]+
-一个或多个单词字符,除了
(?:[-.][^\W_]+){0,3}
-零次、一次、两次或三次出现-
/
,然后出现
以外的一个或多个单词字符
\z
-字符串结尾
请参阅.Try^[^\W_]+(?:[-\W_]+){0,3}$
(在Ruby中,它必须写为\A[^\W_]+(?:[-\W_]+{0,3}\z
)谢谢,非常有用!我可以问一下,为什么要包括下划线,比如第一个否定组[^\W\u]
?