javascript 正则表达式以防止字符串开头和结尾出现双下划线

gjmwrych  于 2023-01-19  发布在  Java
关注(0)|答案(3)|浏览(126)

我现在有一个正则表达式来匹配url子路径。
^(?!^__.*__$).[a-zA-Z0-9_.-]+$
我只想禁用字符串开头和结尾的2个下划线,因为这是一个保留字符串。应该允许2个以外的任何数量的下划线
例如:

_should_work_
__should_work___
_should_work___
__should_not_work__

现在的问题是,即使我有两个以上的下划线,正则表达式仍然不匹配

___should_work_but_doesnt__________

你可以在这里查看正则表达式:
https://regex101.com/r/H9F1NN/1

hk8txs48

hk8txs481#

您可以使用

^(?!_(?!_))(?!(?:.*[^_])?_$)\w+$

请参见regex demo

  • 详细信息 *:
  • ^-字符串开始
  • (?!_(?!_))-字符串不应以_开头,且后面不紧跟另一个_字符
  • (?!(?:.*[^_])?_$)-字符串不能以_结尾,且该字符串前面紧跟着_以外的字符,或者该字符串不能位于字符串的开头
  • \w+-一个或多个字母、数字或下划线
  • $-字符串结束。
zzoitvuj

zzoitvuj2#

你可以这样做

^(?!^__[^_]+(_[^_]+)*__$).[a-zA-Z0-9_.-]+$
^(?!^__[^_].*(?<!_)__$).[a-zA-Z0-9_.-]+$

其中,[^_]+(_[^_]+)*[^_].*(?<!_)都匹配任何不以下划线开头和结尾的字符串。

fykwrbwg

fykwrbwg3#

你可以否定测试,这会让测试更容易:

const regex = /^__[^_].*[^_]__$/;
['_ok_', '_ok__', '__ok_too_', '__bad__', '__bad_as_well__', '___ok__', '___ok____'].forEach(str => {
  console.log(str, '=>', !regex.test(str));
});

输出:

_ok_ => true
_ok__ => true
__ok_too_ => true
__bad__ => false
__bad_as_well__ => false
___ok__ => true
___ok____ => true

正则表达式的解释:

  • ^--字符串起始处的锚点
  • __[^_]--应为两个下划线和一个其他字符
  • .*--任何内容
  • [^_]__--应为一个非下划线字符和两个下划线
  • $--管柱末端的锚

相关问题