.net 用于替换<;span></span>;用&;nbsp;
正在尝试使用正则表达式将示例html中的任何空白替换为“”.net 用于替换<;span></span>;用&;nbsp;,.net,regex,.net,Regex,正在尝试使用正则表达式将示例html中的任何空白替换为“” <span someattr="a">and some words with spaces</span> 和一些带空格的单词 这是一个桌面应用程序,这个html来自/来自第三方控件,无法处理任何类型的html解析,因此我只能使用正则表达式 我似乎无法想出一个正则表达式,它只匹配任何数量的span标记中的任何空格 谢谢正则表达式本身不适合嵌套数据。如果不能使用第三方解析器,最好的办法是咬紧牙关,编写一些代码(可
<span someattr="a">and some words with spaces</span>
和一些带空格的单词
这是一个桌面应用程序,这个html来自/来自第三方控件,无法处理任何类型的html解析,因此我只能使用正则表达式
我似乎无法想出一个正则表达式,它只匹配任何数量的span标记中的任何空格
谢谢正则表达式本身不适合嵌套数据。如果不能使用第三方解析器,最好的办法是咬紧牙关,编写一些代码(可能使用解析器生成器)来解析嵌套
(也就是说,请查看您的regexp库的文档;您可能会发现它具有帮助解析嵌套数据的扩展,例如.net的构造)Regex本身不适合嵌套数据。如果不能使用第三方解析器,最好的办法是咬紧牙关,编写一些代码(可能使用解析器生成器)来解析嵌套
(也就是说,请查看您的regexp库的文档;您可能会发现它有一些扩展来帮助解析嵌套数据,例如.net的构造)对于非常大的字符串,这可能会非常慢 但这是可行的:
(?<=\<span[^>]*>[^<]+)\s(?=[^<]+\</span>)
(?[^对于非常大的字符串,这可能非常慢
但这是可行的:
(?<=\<span[^>]*>[^<]+)\s(?=[^<]+\</span>)
(?[^这个怎么样?请注意,代码块正在消耗
,因此我将符号与文本的其余部分分开以使其可见。regex replace中的行实际上是:
m.Groups[“text”].Value.Replace(“,”)
以下是示例:
string html = @"<span someattr=""a"">and some words with spaces</span>";
string pattern = @"<(?<tag>\w*)(?<attributes>[^>]+)?>(?<text>.*)</\k<tag>>";
string result = Regex.Replace(html, pattern,
m => String.Format("<{0}{1}>{2}</{0}>",
m.Groups["tag"].Value,
m.Groups["attributes"].Value,
m.Groups["text"].Value.Replace(" ", "& nbsp;")
)
);
stringhtml=@“和一些带空格的单词”;
字符串模式=@“]+)?>(?*”;
string result=Regex.Replace(html、模式、,
m=>String.Format(“{2}”,
m、 组[“标记”]。值,
m、 组[“属性”]。值,
m、 组[“文本”]。值。替换(“,”)
)
);
结果=和一些带空格的单词
然而,如果您有嵌套的span标记,事情会很快变得复杂
编辑:重建标记和属性,添加字符串格式来整理这些内容如何?请注意,代码块正在消耗
,因此我将符号与文本的其余部分分开,使其可见。regex replace中的行实际上是:
m.Groups[“text”].Value.Replace(“,”)
以下是示例:
string html = @"<span someattr=""a"">and some words with spaces</span>";
string pattern = @"<(?<tag>\w*)(?<attributes>[^>]+)?>(?<text>.*)</\k<tag>>";
string result = Regex.Replace(html, pattern,
m => String.Format("<{0}{1}>{2}</{0}>",
m.Groups["tag"].Value,
m.Groups["attributes"].Value,
m.Groups["text"].Value.Replace(" ", "& nbsp;")
)
);
stringhtml=@“和一些带空格的单词”;
字符串模式=@“]+)?>(?*”;
string result=Regex.Replace(html、模式、,
m=>String.Format(“{2}”,
m、 组[“标记”]。值,
m、 组[“属性”]。值,
m、 组[“文本”]。值。替换(“,”)
)
);
结果=和一些带空格的单词
然而,如果您有嵌套的span标记,事情会很快变得复杂
编辑:重建了标记和属性,添加了字符串格式来整理内容半相关,在寻找解决方案时,我发现了一篇基于php的perl正则表达式文章,这篇文章可能对.net有帮助,也可能没有帮助:
半相关,在寻找解决方案时,我发现了一篇基于php的perl正则表达式文章,这篇文章可能对.net有帮助,也可能没有帮助:
将以下所有情况替换为”
:
(?(?:(?!(?)|(?)(?:(?!用”
替换所有出现的以下内容:
(?(?:(?!(?)|(?)(?:(?!这似乎可行,但我肯定会先做一些认真的单元测试(和代码清理)。这是基于的第3.17节,并结合了中的库片段。(注意:不会使用嵌套的span标记)。
公共类MyClass
{
私有静态正则表达式outerRegex=新正则表达式((?).*(?=)”,
RegexOptions.Singleline | RegexOptions.IgnoreCase);
私有静态正则表达式innerRegex=新正则表达式(@“\s”);
公共静态void Main()
{
string subjectString=“我的狗有”+
“还有一些带有空格和跳蚤的单词”+
“空间z”;
字符串resultString=outerRegex.Replace(subjectString,
新MatchEvaluator(计算机置换);
Console.WriteLine(结果字符串);
}
公共静态字符串计算机替换(匹配结果)
{
//对外部正则表达式的每个匹配项运行内部搜索和替换
//(绳子没有逃脱,所以我把它弄断了)
返回innerRegex.Replace(matchResult.Value,&“+”nbsp;”;
}
}
这似乎可行,但我肯定会先做一些认真的单元测试(和代码清理)。这是基于的第3.17节,并结合了中的库片段。(注意:不适用于嵌套的span标记)。
公共类MyClass
{
私有静态正则表达式outerRegex=新正则表达式((?).*(?=)”,
RegexOptions.Singleline | RegexOptions.IgnoreCase);
私有静态正则表达式innerRegex=新正则表达式(@“\s”);
公共静态void Main()
{
string subjectString=“我的狗有”+
“还有一些带有空格和跳蚤的单词”+
“空间z”;
字符串resultString=outerRegex.Replace(subjectString,
新MatchEvaluator(计算机置换);
Console.WriteLine(结果字符串);
}
公共静态字符串计算机替换(匹配结果)
{
//对外部正则表达式的每个匹配项运行内部搜索和替换
//(绳子没有逃脱,所以我把它弄断了)
返回innerRegex.Replace(matchResult.Value,&“+”nbsp;”;
}
}
这实际上不起作用。如果字符串中有两个跨距,这将匹配两个跨距之间的任何空格
public class MyClass
{
private static Regex outerRegex = new Regex("(?<=<span[^>]*>).*?(?=</span>)",
RegexOptions.Singleline | RegexOptions.IgnoreCase);
private static Regex innerRegex = new Regex(@"\s");
public static void Main()
{
string subjectString = "my dog has <span someattr=\"a\">" +
"and some words with spaces</span> fleas" +
"<frog>space z</frog> <span> </span>";
string resultString = outerRegex.Replace(subjectString,
new MatchEvaluator(ComputeReplacement));
Console.WriteLine(resultString);
}
public static string ComputeReplacement(Match matchResult)
{
// Run the inner search-and-replace on each match of the outer regex
// (the string was not getting escaped so I broke it up)
return innerRegex.Replace(matchResult.Value, "&" + "nbsp;");
}
}