1

我一直在研究一个 url 解析器,但我在让结尾正确时遇到了一些麻烦

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

如果字符串前面没有正斜杠( ) ,我不希望)在字符串末尾有一个。\它也不能以"\ <>空格结尾。我的努力是:

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

如何正确书写?

4

1 回答 1

0

你想要

  • 允许可能以 \)、))、))) 结尾的字符串
  • 拒绝以 "、\、<、>、空格或 ) 结尾的字符串
  • 所有其他字符串都可以

最后一个关闭参数需要包含在拒绝字符中,以便如果字符串以 ) 结尾,则可以正确找到它

我在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

我正在使用两个由“或”管道分隔的正则表达式lookbehinds

((?<!(["\\<>)]|\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
于 2013-04-28T02:27:18.667 回答