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
则表达式中的&
被视为 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 /
)。如果需要定义'
,请在字符类中使用''
。