我是RegeX的新手,需要做以下事情: 输入:一些以一切开头的单词,后跟一些固定的东西,如“_CHR”,然后立即用一些数字,如123,然后是其他任何东西。我想找到那些并用该数字的Character表示替换该数字...... 所以例如:输入:“Hello Pi_CHR241to你好吗” 将替换为“HelloPiñto你好吗”
答案 0 :(得分:3)
由于您只想替换_CHRnnn
位,因此足以搜索:
_CHR(\d+)
匹配后,反向引用号1将包含字符代码。
有了这个,你可以:
string resultString = null;
resultString = Regex.Replace(subjectString, @"_CHR(\d+)", new MatchEvaluator(ComputeReplacement));
public String ComputeReplacement(Match m) {
return ToString((char)(Int32.Parse(m.Groups[1].Value)));
}
编辑:感谢Alan Moore的C#专业知识和正则表达式改进思路!
答案 1 :(得分:2)
好吧,理论上你的字符串可能以你的'encoding'字符串开头或结尾,所以我不知道你想要担心它之前或之后的内容,但只是找到该模式的任何实例的出现
假设您正在寻找任何unicode字符,您可以查找最多4个十六进制数字,或最多5个十进制数字。因此,您的RegEx可能如下所示:
HEX: _CHR[0-9A-F]{1,4}
DEC: _CHR[0-9]{1,5}
如果您想匹配任何一种格式,请尝试以下内容:
_CHR([0-9A-F]{1,4}|[0-9]{1,5})
我认为您不能直接使用RegEx进行替换。 RegEx通常只是直接替换,您正在寻找功能替代品。但无论你编写什么语言都应该很容易获得匹配的集合并循环遍历它,解析它们并根据需要进行替换。
修改强> 关于你的匹配问题,我不能在不知道你的语言的情况下给出细节。但是在伪代码中,你会做以下几点:
Dim pMatches = RegEx.Matches(myInput, myPattern)
Const pfx As String = "_CHAR", ccode As String
For Each m As Match in pMatches
ccode = m.Value.Replace(pfx, "")
myInput.Replace(m.Value, GetUniChar(ccode))
Next
这大致是VB.NET语法,但您需要将其翻译为您正在使用的任何语言。如果您需要任何解释,请回复。
答案 2 :(得分:1)
该方法的问题在于,如果符号后面的文本也是数字,则正则表达式模式很容易将其误认为符号的其余部分。你最好使用html标准&#F1;
。如果必须使用示例中的方法,则必须使用固定的位数。
string resultString = null;
resultString = Regex.Replace(subjectString, @"&#([0-9A-Fa-f]+);", new MatchEvaluator(ComputeReplacement));
//alternateive: @"_CHR(\d{3})" - fixed number of digits
//or: @"_CHR(\d+)" - ABSOLUTELY SURE a number will never follow a special character
public string ComputeReplacement(Match m) {
return ((char)(int.Parse(m.Groups[1].Value, NumberStyles.HexNumber))).ToString();
}