2

我怎样才能使用类似的东西

return Regex.Replace("/(^)?(<br\s*\/?>\s*)+$/", "", source);

替换这种情况:

<br>thestringIwant => thestringIwant
<br><br>thestringIwant => thestringIwant
<br>thestringIwant<br> => thestringIwant
<br><br>thestringIwant<br><br> => thestringIwant
thestringIwant<br><br> => thestringIwant

它可以在开始或结束时有多个 br 标签,但我不想删除中间的任何 br 标签。

4

7 回答 7

5

几个循环可以解决这个问题并且更容易阅读和理解(使用正则表达式 = 明天你看看你自己的代码想知道到底发生了什么)

while(source.StartsWith("<br>")) 
    source = source.SubString(4);
while(source.EndsWith("<br>"))  
    source = source.SubString(0,source.Length - 4);

return source;
于 2013-09-10T11:12:36.510 回答
1

当我看到您的正则表达式时,听起来 br 标签中可能允许使用空格。因此,您可以尝试以下操作:

string s = Regex.Replace(input,@"\<\s*br\s*\/?\s*\>","");
于 2013-09-10T11:19:36.980 回答
0

不需要使用正则表达式

你可以简单地使用

yourString.Replace("<br>", "");

<br>将从您的字符串中删除所有出现的 。

编辑:

要将
标签保留在字符串之间,只需使用如下 -

var regex = new Regex(Regex.Escape("<br>"));
var newText = regex.Replace("<br>thestring<br>Iwant<br>", "<br>", 1);

newText = newText.Substring(0, newText.LastIndexOf("<br>"));

Response.Write(newText);

这只会<br>从您的字符串中删除第一次和最后一次出现的 。

于 2013-09-10T11:07:39.217 回答
0

你可以为这些东西写一个扩展方法

 public static string TrimStart(this string value, string stringToTrim)
    {
        if (value.StartsWith(stringToTrim, StringComparison.CurrentCultureIgnoreCase))
        {
            return value.Substring(stringToTrim.Length);
        }
        return value;
    }


    public static string TrimEnd(this string value, string stringToTrim)
    {
        if (value.EndsWith(stringToTrim, StringComparison.CurrentCultureIgnoreCase))
        {                
            return value.Substring(0, value.Length - stringToTrim.Length);
        }
        return value;
    }

你可以这样称呼它

 string example = "<br> some <br> test <br>";
 example = example.TrimStart("<br>").TrimEnd("<br>"); //output  some <br> test 
于 2013-09-10T11:15:13.927 回答
0

如果您还希望它与它一起使用

<br />

那么你可以使用

return Regex.Replace("((:?<br\s*/?>)*<br\s*/?>$|^<br\s*/?>(:?<br\s*/?>)*)", "", source);

编辑:

现在它还应该照顾多个

<br\s*/?>

在行的开头和结尾

于 2013-09-10T11:16:06.280 回答
0

分两次做怎么样...

result1 = Regex.Replace("/^(<br\s*\/?>\s*)+/", "", source);

然后将结果输入

result2 = Regex.Replace("/(<br\s*\/?>\s*)+$/", "", result1);

我知道这会增加一些开销,但极大地简化了事情,并且节省了试图在中间匹配所有不是 BR 的东西。

请注意这两者之间的细微差别......一个在开始时匹配它们,一个在结束时匹配它们。这样做可以保持保持正则表达式的灵活性,该正则表达式允许 BR 标签的一般格式,而不是过于严格。

于 2013-09-10T11:18:50.800 回答
0

我相信人们不应该忽视正则表达式的力量。如果您适当地命名正则表达式,那么将来维护它就不难了。

我编写了一个示例程序,它使用正则表达式完成您的任务。它还忽略开头和结尾的字符大小写和空格。您可以尝试您拥有的其他源字符串示例。

最重要的是,它会更快。

using System;
using System.Text.RegularExpressions;

namespace ConsoleDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            string result;
            var source = @"<br><br>thestringIwant<br><br> => thestringIwant<br/> same <br/> <br/>  ";
            result = RemoveStartEndBrTag(source);
            Console.WriteLine(result);
            Console.ReadKey();
        }

        private static string RemoveStartEndBrTag(string source)
        {
            const string replaceStartEndBrTag = @"(^(<br>[\s]*)+|([\s]*<br[\s]*/>)+[\s]*$)";
            return Regex.Replace(source, replaceStartEndBrTag, "", RegexOptions.IgnoreCase);
        }
    }
}
于 2013-09-10T11:52:13.893 回答