首先,这里是我允许用户输入的字符串中的参数:
字符串格式:
应该有效的字符串示例:
/get D0cUm3nt ex4Mpl3' ~now
D0cUm3nt ex4Mpl3'
/post T(h)(i5 s(h)ou__ld w0rk t0-0'
不应该起作用的字符串示例:
//get document~now
~later
example ~now~later
在我通过正则表达式传递字符串之前,我修剪了字符串开头和结尾处的任何空格(在看到任何文本之前)但是我没有修剪字符串中的双空格,因为有些查询需要它们。
这是我使用的正则表达式:
^(/{0,1}[a-zA-Z])?[\w\s()'-]*((\s~[a-zA-Z]*){0,2})?$
稍微分解一下:
[instruction check] - (/{0,1}[a-zA-Z])?
[query check] - [\w\s()'-]*
[parameter check] - ((\s~[a-zA-Z]*){0,2})?
这是我第一次真正从教程中完成任何严重的正则表达式,所以我想知道我的正则表达式中有什么我可以更改以使其更紧凑/更有效吗? < / p>
赞赏所有新观点!
感谢。
答案 0 :(得分:1)
来自你的正则表达式:^(/{0,1}[a-zA-Z])?[\w\s()'-]*((\s~[a-zA-Z]*){0,2})?$
,
您可以将{0,1}
更改为?
,这是一个说0或1次的快捷方式:
^(/?[a-zA-Z])?[\w\s()'-]*((\s~[a-zA-Z]*){0,2})?$
最后一部分出现0,1或2次,然后?
是多余的:
^(/?[a-zA-Z])?[\w\s()'-]*(\s~[a-zA-Z]*){0,2}$
第一部分也可以简化,?
之后的/
是多余的:
^(/[a-zA-Z])?[\w\s()'-]*(\s~[a-zA-Z]*){0,2}$
如果您不使用捕获的群组,则可以将其更改为非捕获群组:(?: )
效率更高
^(?:/[a-zA-Z])?[\w\s()'-]*(?:\s~[a-zA-Z]*){0,2}$
您还可以使用不区分大小写的修饰符(?i)
:
^(?i)(?:/[a-z])?[\w\s()'-]*(?:\s~[a-z]*){0,2}$
最后,如OP中所述,~
必须跟[a-zA-Z]
后面,因此请将最后*
更改为+
:
^(?i)(?:/[a-z])?[\w\s()'-]*(?:\s~[a-z]+){0,2}$
答案 1 :(得分:0)
这看起来稍微好一些:
^(?:/?[a-zA-Z]*\s)?[\w\s()'-]*(?:\s~[a-zA-Z]*)*$
答案 2 :(得分:0)
答案 3 :(得分:0)
也许这就是你要找的东西:
var regex = /^((\/)?[a-zA-Z]+)?[\w\s()'-]*((\s~)?[a-zA-Z]+){0,2}$/;