Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 后标记系统中文本的适当正则表达式_Regex_Regex Lookarounds_Regex Group - Fatal编程技术网

Regex 后标记系统中文本的适当正则表达式

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 这

我正在创建一个基本上是克隆的实践,我正在尝试实现一个标记系统,尽管我在标记名的正则表达式方面遇到了一些问题

我正试图实现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
这些应该返回一个负数,为了回答这个问题,假设空白意味着一个新标签的开始,并且可以安全地忽略掉

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]