这个正则表达式是解析我的字符串的最有效方法吗?

时间:2014-02-05 02:21:11

标签: javascript regex string

首先,这里是我允许用户输入的字符串中的参数:

  • 如果有斜线,则必须出现在字符串的开头,其他地方,仅限于1,是可选的,必须由[a-zA-Z]继承。
  • 如果有波浪号,则必须在空格“”之后出现,没有别的,是可选的,必须由[a-zA-Z]继承。此外,此表达式仅限于2.(即:~exa~mple通过,但~exa~mp~le未通过)
  • 斜杠后跟一个单词是一条指令,如/ get或/ post。
  • 波形符后跟一个单词是一个参数,如〜now或~after。

字符串格式:

  • [指令](可选)[查询] [额外参数](可选)
  • [指令] - 必须仅包含/成功[a-zA-Z]
  • [query] - 可以包含[\ w \ s()' - ](字母数字,空格,括号,撇号,破折号)
  • [额外参数] - 〜前面有空格,只有[a-zA-Z]成功

应该有效的字符串示例:

/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>

赞赏所有新观点!

感谢。

4 个答案:

答案 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]*)*$

https://codereview.stackexchange.com/更适合这种事情

答案 2 :(得分:0)

假设捕获组对您有用:

^((?:\/|\s~)[a-z]+)?([\w\s()'-]+)(~[a-z]+)?$

Regex101 Demo

答案 3 :(得分:0)

也许这就是你要找的东西:

var regex = /^((\/)?[a-zA-Z]+)?[\w\s()'-]*((\s~)?[a-zA-Z]+){0,2}$/;