C#正则表达式只查找并替换大写字符和don'的链接;不匹配排除

C#正则表达式只查找并替换大写字符和don'的链接;不匹配排除,c#,regex,C#,Regex,我很难完成一个简单的正则表达式任务。我想用以下排除项替换文本中所有大写字母为小写字母的href链接 比如说 href=“/image ZOOM.aspx?UPPERcasE=someThing”匹配并替换为 href=“/image zoom.aspx?大写=某物” href=“/image coorrect.aspx”-不匹配 它还将排除href=“javascript:function();”,并且不会在标记之间使用小写字母 例如: href=“/images/PDFs/.pdf”被翻译成

我很难完成一个简单的正则表达式任务。我想用以下排除项替换文本中所有大写字母为小写字母的href链接

比如说

href=“/image ZOOM.aspx?UPPERcasE=someThing”
匹配并替换为

href=“/image zoom.aspx?大写=某物”

href=“/image coorrect.aspx”
-不匹配

它还将排除
href=“javascript:function();”
,并且不会在
标记之间使用小写字母

例如:

href=“/images/PDFs/.pdf”
被翻译成

href=“/images/**pdfs**/.pdf”

我尝试过类似于
href=“([^”]*[A-Z]+[^”]*)”
的方法,但仍然匹配所有小写的链接。请你照点光好吗

谢谢

可能您正在使用“/i”修饰符,请确保您没有使用“RegexOptions.IgnoreCase”

List List=新列表(){
“href=\”/image ZOOM.aspx?大写=someThing\”,
“href=\”/image zoom.aspx?大写=something\”,
“href=\”/image coorrect.aspx\”,
“href=\”javascript:function();\“”
};
foreach(列表中的字符串l)
{
if(Regex.IsMatch(l,“href=\”([^\“]*[A-Z]+[^\“]*])\“”)
{
控制台写入线(l);
}
}
将仅匹配:href=“/image ZOOM.aspx?UPPERcasE=someThing”

可能您正在使用“/i”修饰符,请确保您没有使用“RegexOptions.IgnoreCase”

List List=新列表(){
“href=\”/image ZOOM.aspx?大写=someThing\”,
“href=\”/image zoom.aspx?大写=something\”,
“href=\”/image coorrect.aspx\”,
“href=\”javascript:function();\“”
};
foreach(列表中的字符串l)
{
if(Regex.IsMatch(l,“href=\”([^\“]*[A-Z]+[^\“]*])\“”)
{
控制台写入线(l);
}
}

将仅匹配:href=“/image ZOOM.aspx?大写=someThing”

棘手的部分是您的
要求。一旦你把URL的每一部分分成几个组,这其实很简单

href="/images/PDFs/<%=Product.ShortSku %>.pdf"
      |_____1_____||__________2_________||_3_|
我最终使用了这种模式,它使用命名组:

@"href=""(?!javascript:)(?=[^""]*[A-Z])(?<Start>[^""<]+)(?<Special><%[^""]+%>)?(?<End>[^""]*)"""

这将使用lambda代替
匹配计算器
。本质上,我们正在重建字符串并引用命名的组,改变我们想要修改的组的大小写。这段代码的微妙之处在于,如果一个组不匹配,我们仍然可以引用它,它只会给我们一个空字符串。另外,从代码中可能看不出这一点,但当匹配失败时,原始字符串将被
Regex原封不动地返回。替换
棘手的部分是您的
要求。一旦你把URL的每一部分分成几个组,这其实很简单

href="/images/PDFs/<%=Product.ShortSku %>.pdf"
      |_____1_____||__________2_________||_3_|
我最终使用了这种模式,它使用命名组:

@"href=""(?!javascript:)(?=[^""]*[A-Z])(?<Start>[^""<]+)(?<Special><%[^""]+%>)?(?<End>[^""]*)"""

这将使用lambda代替
匹配计算器
。本质上,我们正在重建字符串并引用命名的组,改变我们想要修改的组的大小写。这段代码的微妙之处在于,如果一个组不匹配,我们仍然可以引用它,它只会给我们一个空字符串。另外,从代码中可能看不出这一点,但当匹配失败时,原始字符串将被
Regex.Replace

返回。好的,我很困惑。如果页面上有控件和/或标记的集合,可以测试它们是否为锚类型,如果是,可以从标记中获取href属性,然后将href设置为href.ToLower


使用正则表达式来解决字符串和DOM解析问题有什么特别的原因吗?对我来说似乎太过分了。

好吧,我很困惑。如果页面上有控件和/或标记的集合,可以测试它们是否为锚类型,如果是,可以从标记中获取href属性,然后将href设置为href.ToLower


使用正则表达式来解决字符串和DOM解析问题有什么特别的原因吗?对我来说似乎太过分了。

如果你只是转换成小写,那么如果它匹配已经是小写的链接,又有什么关系呢?实际上,无论如何都不会发生任何事情。您提供的模式与我的href=“/image coorrect.aspx”不匹配。你能显示你的测试代码吗?这是真的,但是当我在链接中时,我不希望它被转换成小写。我还没有测试代码,我正在使用visual studio中的Quick find和常规的expressions@McLovin您的问题是围绕C#还是使用visualstudio的Find/Replace with regex?它们是完全不同的,所以需要澄清。如果您只是转换成小写,那么如果它匹配已经是小写的链接,又有什么关系呢?实际上,无论如何都不会发生任何事情。您提供的模式与我的href=“/image coorrect.aspx”不匹配。你能显示你的测试代码吗?这是真的,但是当我在链接中时,我不希望它被转换成小写。我还没有测试代码,我正在使用visual studio中的Quick find和常规的expressions@McLovin您的问题是围绕C#还是使用visualstudio的Find/Replace with regex?它们完全不同,所以需要澄清。这非常感谢,但我如何从匹配中排除?谢天谢地,URL只能是ASCII!(?)那太好了,谢谢,但是我如何从匹配中排除?谢天谢地,URL只能是ASCII!(?)如果您的字母不是
[A-Z]
,会发生什么?@tchrist
[A-Z]
仅用于匹配出现大写字母的内容。如果不存在,则匹配失败,不会发生替换。如果它们确实存在,那么模式在
[^”“]+
上真正匹配,即,所有不是双引号的内容。最终,
string[] inputs =
{
    "href=\"/image-ZOOM.aspx?UPPERcasE=someThing\"", // match
    "href=\"/image-coorect.aspx\"",  // no match, lowercase
    "href=\"javascript:function();\"", // no match, javascript
    "href=\"/images/PDFs/<%=Product.ShortSku %>.pDf\"", // bypass <% %> content
};

string pattern = @"href=""(?!javascript:)(?=[^""]*[A-Z])(?<Start>[^""<]+)(?<Special><%[^""]+%>)?(?<End>[^""]*)""";

foreach (var input in inputs)
{
    Console.WriteLine("{0,6}: {1}", Regex.IsMatch(input, pattern), input);
    string result = Regex.Replace(input, pattern,
                        m => "href=\""
                            + m.Groups["Start"].Value.ToLower()
                            + m.Groups["Special"].Value
                            + m.Groups["End"].Value.ToLower()
                            + "\"");
    Console.WriteLine("Result: " + result);
    Console.WriteLine();
}