什么是 C# Regex 等价于 Java 的 appendReplacement 和 appendTail

Posted

技术标签:

【中文标题】什么是 C# Regex 等价于 Java 的 appendReplacement 和 appendTail【英文标题】:What is the C# Regex equivalent to Java's appendReplacement and appendTail 【发布时间】:2011-04-16 21:51:55 【问题描述】:

更新

这是我想出的。我还没有对其进行测试,因为它是仍然需要移植的更大代码段的一部分。

你能看到任何看起来不合适的地方吗?

private const string tempUserBlock = "%%%COMPRESS~USER0~1%%%";
string html = "some html";
int p = 0;
var userBlock = new ArrayList();

MatchCollection matcher = preservePatterns[p].Matches(html);
int index = 0;
StringBuilder sb = new StringBuilder();
int lastValue = 0;

foreach(Match match in matcher)
    string matchValue = match.Groups[0].Value;

    if(matchValue.Trim().Length > 0) 
        userBlock.Add(matchValue);

        int curIndex = lastValue + match.Index;
        sb.Append(html.Substring(lastValue, curIndex));
        sb.AppendFormat(tempUserBlock, p, index++);

        lastValue = curIndex + match.Length;
    


sb.Append(html.Substring(lastValue));
html = sb.ToString();

以下为原帖:

这是原始的 Java:

private static final String tempUserBlock = "%%%COMPRESS~USER0~1%%%";
String html = "some html";
int p = 0;
List<String> userBlock = new ArrayList<String>();

Matcher matcher = patternToMatch.matcher(html);
int index = 0;
StringBuffer sb = new StringBuffer();
while (matcher.find())

    if (matcher.group(0).trim().length() > 0)
    
        userBlock.add(matcher.group(0));
        matcher.appendReplacement(sb, MessageFormat.format(tempUserBlock, p, index++));
    

matcher.appendTail(sb);
html = sb.toString();

到目前为止我的 C# 转换

private const string tempUserBlock = "%%%COMPRESS~USER0~1%%%";
string html = "some html";
int p = 0;
var userBlock = new ArrayList();

MatchCollection matcher = preservePattern.Matches(html);
int index = 0;
StringBuilder sb = new StringBuilder();

for(var i = 0; i < matcher.Count; ++i)
    string match = matcher[i].Groups[0].Value;
    if(match.Trim().Length > 0) 
        userBlock.Add(match);
        // WHAT DO I DO HERE?
        sb.Append( string.Format(tempUserBlock, p, index++) );            
    

// WHAT DO I DO HERE?
matcher.appendTail(sb);
html = sb.toString();

请参阅上面的评论,我会问“我在这里做什么?”

澄清 上面的 Java 代码在某些 HTML 上执行字符串替换。它保存了最初替换的文本,因为它需要稍后在完成一些空白压缩后重新插入。

【问题讨论】:

您能否更好地定义问题,例如,预期结果是什么以及您得到的结果是什么? 我猜是标有// WHAT DO I DO HERE?的部分 你能发布完整的代码吗,当我们不知道 p 或 tempUserBlock 是什么时,很难帮助“我在这里做什么”下面的行(我认为这是问题) /跨度> 从我对 Java 非常有限的理解来看,我查看了这段代码,我看到了两个永远不应该一起看到的概念:HTML 和 Regex。如果这段代码正在做我认为的事情(使用正则表达式解析 HTML),我强烈建议您从重写此代码的机会中获利,以便正确执行此操作,即使用像 Html Agility Pack 或 SGMLReader 这样的 html 解析器。忘记那些正则表达式、字符串生成器和字符串修剪。以正确的方式去做。 @Darin,我同意你的看法;但这应该是已经用 Java 编写的 HTML/CSS/javascript 压缩器的快速移植。 【参考方案1】:

无需重现 Java 的 appendReplacement/appendTail 功能; .NET 有更好的东西:MatchEvaluator。看看吧:

string holder = "Element 0 = 1";
string s0 = "111 222 XYZ";
ArrayList arr = new ArrayList();

string s1 = Regex.Replace(s0, @"\d+",
  m => string.Format(holder, arr.Add(m.Value), m.Value)
);

Console.WriteLine(s1);
foreach (string s in arr)

  Console.WriteLine(s);

输出:

Element 0 = 111 Element 1 = 222 XYZ
111
222

有几种方法可以实现 MatchEvaluator,所有方法都在 this article 中进行了全面讨论。这个(lambda 表达式)是迄今为止最酷的。

【讨论】:

我早上去看看。 +1 基于“酷”的编程。【参考方案2】:

我不熟悉 Java 正则表达式类,但这是我对您的代码所做的 C# 解释:

private const string tempUserBlock = "%%%COMPRESS~USER0~1%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new List<string>(); 

MatchCollection matcher = preservePattern.Matches(html); 
StringBuilder sb = new StringBuilder(); 
int last = 0;
foreach (Match m in matcher)

    string match = m.Groups[0].Value; 
    if(match.Trim().Length > 0)  
        userBlock.Add(match); 
        sb.Append(html.Substring(last, m.Index - last));
        sb.Append(m.Result(string.Format(tempUserBlock, p, index++)));
    
    last = m.Index + m.Length;

sb.Append(html.Substring(last));
html = sb.ToString(); 

【讨论】:

太棒了,这几乎就是我想出的!您将 m.Index + m.Length 放在正确的位置。谢谢。稍后我会告诉你它的性能。

以上是关于什么是 C# Regex 等价于 Java 的 appendReplacement 和 appendTail的主要内容,如果未能解决你的问题,请参考以下文章

等效于 C++ 中的 Regex.Replace

C++ 等价于 C# 的内部

什么是 C# 中 Java 的 ByteBuffer.wrap 的等价物?

JAVA正则表达式

Java 等价于不变文化

Java 和 Scala 中 C# 的访问修饰符的等价物是啥?