如何正确结束正则表达式网址匹配

时间:2013-01-15 13:45:23

标签: c++ regex

我一直在处理网址解析器,但我在结束时遇到了一些问题

sregex rex = sregex::compile("((?:ftp|http|https)://)([^<>\\s/]+/+[^\\s\"<>]+([^)\\s\\\"<>$]*[\\)$]*))", sregex::icase );

如果字符串末尾没有前向斜杠()),我希望不允许在字符串末尾添加一个\。它也不能以"\ <>或空格结尾。我努力做到的是:

 ([^)\\s\\\"<>$]*[\\)$]*) 

如何正确编写?

1 个答案:

答案 0 :(得分:0)

你想要

  • 允许以\),)),))))
  • 结尾的字符串
  • 拒绝以“,\,&lt;,&gt;,空格或”
  • 结尾的叮咬
  • 所有其他字符串都可以

最后一个关闭的paran需要包含在deny字符中,这样如果字符串结束,则可以正确找到它

我在powershell中试过这个,它按预期工作。

clear

foreach ($String in @("", "abc", "abc\)", "abc>", "abc<", "abc\", "abc""", "abc)", "abc))", "abc)))", "abc ", "abc`t")) {
    if ( $String -match '((?<!(["\\<>)]|\s))$)|((?<=\\|\){1,})\)$)' )  {
        Write-Host "'$String' is good"

        } else {
        Write-Host "'$String' is bad"
        } # end if
    } # next string

我正在使用两个由“或”管道

分隔的正则表达式
((?<!(["\\<>)]|\s))$)

验证否定字符不在字符串的末尾

((?<=\\|\){1,})\)$)

如果最后一个字符是a)那么所有它应该以\或一个或多个)

开头

这个小例程产生以下输出:

'' is good
'abc' is good
'abc\)' is good
'abc>' is bad
'abc<' is bad
'abc\' is bad
'abc"' is bad
'abc)' is bad
'abc))' is good
'abc)))' is good
'abc ' is bad
'abc    ' is bad