Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 用于替换<;span></span>;用&;nbsp;_.net_Regex - Fatal编程技术网

.net 用于替换<;span></span>;用&;nbsp;

.net 用于替换<;span></span>;用&;nbsp;,.net,regex,.net,Regex,正在尝试使用正则表达式将示例html中的任何空白替换为“” <span someattr="a">and some words with spaces</span> 和一些带空格的单词 这是一个桌面应用程序,这个html来自/来自第三方控件,无法处理任何类型的html解析,因此我只能使用正则表达式 我似乎无法想出一个正则表达式,它只匹配任何数量的span标记中的任何空格 谢谢正则表达式本身不适合嵌套数据。如果不能使用第三方解析器,最好的办法是咬紧牙关,编写一些代码(可

正在尝试使用正则表达式将示例html中的任何空白替换为“”

<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;");
    }
}