C# 正则表达式上的分析错误

本文关键字:错误 正则表达式 | 更新日期: 2023-09-27 17:56:20

我正在尝试编写 c# 正则表达式,它将过滤以下规则。

  • https://www.test.com/help/about/index.aspx?at=eng&st=png...
  • http://www.test.com/help/about/index.aspx?at=eng&st=png...
  • www.test.com/help/about/index.aspx?at=eng&st=png...
  • test.com/help/about/index.aspx?at=eng&st=png...

我的正则表达式是:

^(http(s)?(:'/'/))?(www'.)?[a-zA-Z0-9-_'.]+/([-a-zA-Z0-9:%_'+.~#?&//=]*) 

当我通过 C# 在线测试器进行测试时,它工作正常,但是当我尝试输入我的代码时,我遇到了解析错误。

法典:

public SSLUrl(XElement configurationEntry)
{
    XAttribute xSsl = configurationEntry.Attribute("ssl");
    XAttribute xIgnore = configurationEntry.Attribute("ignore");
    mUseSSL = false;
    if (xSsl != null)
        bool.TryParse(xSsl.Value, out mUseSSL);
    mIgnore = false;
    if (xIgnore != null)
        bool.TryParse(xIgnore.Value, out mIgnore);
    mRegex = new Regex(HandleRootOperator(configurationEntry.Value),
        RegexOptions.Compiled | RegexOptions.IgnoreCase);
}

示例 XML 文件:

<?xml version="1.0"?>
<SSLSwitch>
<!-- Redirect status code for HTTP and HTTPs-->
  <http>301</http>
  <https>301</https>
  <!-- Do not change HTTP or HTTPS for anything under /system/ -->
  <url ignore="true">^~/system/</url>  
  <!-- Do not change HTTP or HTTPS for anything in the root folder -->
  <url ignore="true">^~/[^/]*'.</url>
 <url ignore="true">^(http(s)?(:'/'/))?(www'.)?[a-zA-Z0-9-_'.]+/([-a-zA-Z0-9:%_'+.?&//=]*)</url>
</SSLSwitch>

错误:

解析实体名称时出错。第 45 行,位置 85。

描述:

执行当前 网络请求。请查看堆栈跟踪以获取有关以下内容的更多信息 错误及其在代码中的起源。

异常详情:

System.Xml.Xml异常:解析实体名称时出错。 第 45 行,位置 85。

源错误:

在执行 当前网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

**

堆栈跟踪:**

[Xml异常:分析实体名称时出错。45号线, 位置 85. System.Xml.XmlTextReaderImpl.Throw(String res, Int32 行号, Int32 行位置) +189
System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) +7432563 System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) +1042
System.Xml.XmlTextReaderImpl.FinishPartialValue() +79
System.Xml.XmlTextReaderImpl.get_Value() +72
System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) +225
System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) +75 System.Xml.Linq.XElement.ReadElementFrom(XmlReader r, LoadOptions o) +722 System.Xml.Linq.XElement.Load(XmlReader reader, LoadOptions options) +79 System.Xml.Linq.XElement.Load(String uri, 加载选项选项) +137 处理程序.SSLSwitch..cctor() +102

C# 正则表达式上的分析错误

则表达式中的&被视为 XML 实体的开头,后跟一个无法解析为 XML 实体的子字符串,因此会出现错误。

我建议

<url ignore="true"><![CDATA[^(https?://)?(www'.)?['w.-]+/([-'w:%+.?&/=]*)]]></url>
                   ^-------------------------------------------------------^

CDATA块中,XML 实体被视为文本。

请注意,'w 几乎与 [a-zA-Z0-9_] 相同(如果在编译 Regex 对象时添加RegexOptions.ECMAScript标志,它将等于该 char 类)。

此外,/,正斜杠没有,有时根本不应该转义,因为它在 .NET 正则表达式中没有任何特殊含义。在PHP或Perl中,它通常用作正则表达式分隔符来分隔动作/模式/修饰符。在 .NET 中,可以使用内联修饰符或RegexOptions标志来修改一些特殊的正则表达式元字符行为,因此,/ 不用于分隔这些正则表达式部分。

我还删除了不必要的分组。我不明白为什么在最后一个字符类中使用//,所以我用 / 替换了它(因为 char 类内的//仍然只匹配 1 /)。如果需要定义',请在字符类中使用''