我试图在.NET中的同一个Regex对象中匹配两个组,所以我可以单独处理它们;我讨厌为每个表达式实例化很多对象。基本上,我想在一个句号之前插入下划线并在感叹号之前插入一个短划线。现在,我知道我可以使用标点符号结构,但我想将每个组用作单独的表达式。
这是我尝试过的百万种方式的变体:
using System.Text.RegularExpressions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var rule = new Regex(@"(\.)(\!)", RegexOptions.Compiled);
var myText = "string. will! way. water! test. quiz! short. long!";
richTextBox1.Text = rule.Replace(rule.Replace(myText, "_$1"), "-$2");
}
}
}
非常感谢。
答案 0 :(得分:3)
这应该有效。它使用Lamba,但如果你想要更多的控制,你可以将它分解为一个函数。匹配代表可以是。基本上,正则表达式引擎会在每次匹配时调用您的委托,并传入匹配的值,以便您可以动态决定如何处理它。
Regex.Replace("Test a. b!", @"([.!])",
(m) => { return m.Value == "." ? "_." : "-!"; }
);
答案 1 :(得分:3)
您可以使用MatchEvaluator重写代码,如下所示:
您可以使用Character Class来包含两个字符,而不是多个捕获组。
string s = "string. will! way. water! test. quiz! short. long!";
string r = Regex.Replace(s, @"[!.]", delegate(Match m) {
return m.Value == "!" ? "-!" : "_.";
});
//=> "string_. will-! way_. water-! test_. quiz-! short_. long-!"
至于多个组.NET不支持分支重置功能(?| ... | ... )
,但是你可以这样做的一种方法是命名组,你可以不受限制地重复使用它们。
string r = Regex.Replace(s, @"(?:(?<punc>\.)|(?<punc>!))", delegate(Match m) {
return m.Groups["punc"].Value == "!" ? "-!" : "_.";
});
答案 2 :(得分:3)
您的问题的答案是:您无法使用群组来执行此操作。多次替换 字符串不受支持,也没有将替换字符串放入匹配本身。
您可以使用正则表达式和匹配评估程序来执行您想要的操作,正如其他答案所示,但是组不参与其中。
您的问题的解决方案是:使用纯字符串替换。您没有做任何复杂到需要正则表达式的事情。
var myText = "string. will! way. water! test. quiz! short. long!";
richTextBox1.Text = myText.Replace(".", "_.").Replace("!", "-!");