C# 替换字符串的一部分

3

我该如何替换一个字符串的一部分,而这部分的起始索引可能是未知的。例如,如果我有以下字符串:

"<sometexthere width='200'>"
"<sometexthere tile='test' width='345'>"

我希望替换宽度属性值,该值可能是未知的,并且如前所述,起始索引也是未知的。

我理解我需要以以下部分为基础进行某种操作,该部分是恒定的,只是我不太明白如何实现。

width='

3
看起来需要用到……正则表达式 - jrummell
3
感谢你以创新的方式绕过了“如何使用正则表达式解析HTML”和“我想用字符串操作解析和构建XML”的标准答案,给你点个赞。 - Alexei Levenkov
11
这似乎需要一个解析器来处理,而不是正则表达式。首先,正则表达式无法考虑到标记语言的语法,其次目前发布的每个正则表达式都是错误的。 - Eric Lippert
不,这看起来需要用到…… HtmlAgilityPack - Brian
2
@EricLippert,我向您的智慧低头。RegEx匹配除XHTML自包含标签外的开放标签非常启发人。 - jrummell
8个回答

35

到目前为止,你已经得到了七个错误的答案,告诉你要用正则表达式来完成解析器的工作。请不要使用正则表达式来完成这项任务。我假设你的字符串是一段标记。让我们假设它是HTML。 那么你的正则表达式对以下内容会做什么:

<html>
<script>
    var width='100';
</script>
<blah width =
              '200'>
... and so on ...

我可以打赌一美元,它替换了 JScript 代码,这是不应该的,也没有替换 blah 标签的属性 - 在属性中有空格是完全合法的。

如果你需要解析一个标记语言,那么请解析标记语言。获取一个解析器并使用它;这就是解析器的作用。


我很高兴有人提到这个。当我读其他答案时,我也是完全同样的想法。 - Kirill Rakhman

4
请查看Regex类,您可以使用此类搜索属性内容并替换其值。
初步考虑,Regex.Replace可能会起到作用:
var newString = Regex.Replace(@".*width='\d'",string.Foramt("width='{0}'",newValue));

6
请参见:https://dev59.com/X3I-5IYBdhLWcg3wq6do该问题询问如何使用正则表达式匹配HTML中的非自闭合标签。 - Khan

2
using System.Text.RegularExpressions;
Regex reg = new Regex(@"width='\d*'");
string newString = reg.Replace(oldString,"width='325'");

如果您在“新宽度”字段的 ' ' 之间放置一个数字,它将返回一个具有新宽度的新字符串。


2
使用正则表达式。
Regex regex = new Regex(@"\b(width)\b\s*=\s*'d+'");

\b代表匹配一个完整的词,\s*代表允许零个或多个空格字符,\d+表示一个或多个数字占位符。要替换数字值,您可以使用:

int nRepValue = 400;
string strYourXML = "<sometexthere width='200'>";

// Does the string contain the width?
string strNewString = String.Empty;
Match match = regex.Match(strYourXML);
if (match.Success)
    strNewString = 
        regex.Replace(strYourXML, String.Format("match='{0}'", nRepValue.ToString()));
else 
    // Do something else...

希望这有所帮助。

为什么是 一个 空格字符?XML 允许无限制的空白 - Eric Lippert
更正 - 我不确定为什么我这样做了 :]. 谢谢。 - MoonKnight

0
使用正则表达式来实现这个功能:
using System.Text.RegularExpressions;

...

string yourString = "<sometexthere width='200'>";

// updates width value to 300
yourString = Regex.Replace(yourString , "width='[^']+'", width='300');

// replaces width value with height value of 450
yourString = Regex.Replace(yourString , "width='[^']+'", height='450');

假设宽度属性始终是数值型的。这并不一定是一个有效的假设。 - Jacob Proffitt

0

我会使用 正则表达式
类似这样的替换宽度值为123456

string aString = "<sometexthere tile='test' width='345'>";
Regex regex = new Regex("(?<part1>.*width=')(?<part2>\\d+)(?<part3>'.*)");
var replacedString = regex.Replace(aString, "${part1}123456${part3}");

0
你可以使用正则表达式(RegEx)查找并替换在“width =”之后单引号中的所有文本。

0

你可以使用正则表达式,例如(?<=width=')(\d+)

示例:

var replaced = Regex.Replace("<sometexthere width='200'>", "(?<=width=')(\\d+)", "123");"

replaced 现在是:<sometexthere width='123'>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接