繁体   English   中英

C#中具有组和值的正则表达式

[英]Regular Expression with Groups and Values in C#

我正在尝试编写一个简单的正则表达式,以在管道分隔的文件中将大约两位数的年份转换为两位数的年份。 我在用:

Regex dateFormat = new Regex(@"\|(\d\d)/(\d\d)/([\d\d)\|");
string convertedString = dateFormat.Replace(contents, @"|$1$220$3|'");

我想要的是| 10/31/09 | 被| 10312009 |代替。

我得到的是| 10 $ 22009 |

我认为问题是.NET正在评估$ 1和$ 3,但正在考虑中间有一个没有价值的组(也许$ 220?)。 如何让.NET知道20是一个常量值而不是组值的一部分?

提前致谢

您对这个问题的直觉是正确的:第二个反向引用被解释为$220 ,而不是$2 要解决此问题,请使用花括号:

dateFormat.Replace(contents,@"|$1${2}20$3|'");

有关.NET正则表达式的更多信息,请参见此处

您的正则表达式文本无法解析。 “ [”应该在那里吗? 将数字包装在{}中以解决替换问题:

Regex dateFormat = new Regex(@"\|(\d\d)/(\d\d)/(\d\d)\|");
string convertedString = dateFormat.Replace(contents, @"|${1}${2}20${3}|'");

您可以修改正则表达式以使用命名组。 命名组的语法为(?)。 然后,在“替换”功能中,您可以使用组名而不是组号。

Regex dateFormat = new Regex(@"\|(?<month>\d\d)/(?<day>\d\d)/(?<year>[\d\d)\|");
string convertedString = dateFormat.Replace(contents, @"|${month}${day}20${year}|'");

我不知道该怎么做,但这是我的解决方法。 使用命名组。

Regex dateFormat = new Regex(@"\|(?<month>\d\d)/(?<date>\d\d)/(?<year>\d\d)\|");
string convertedString = dateFormat.Replace(contents, @"|${month}${date}20${year}|'");

请参阅本页底部的更多信息。

希望能有所帮助。

尝试这个:

string contents = "|10/31/09|";
Regex dateFormat = new Regex(@"\|(?<mm>\d\d)/(?<dd>\d\d)/(?<yy>\d\d)\|");
Console.WriteLine(dateFormat.Replace(contents, "|${mm}${dd}20${yy}|"));

更多信息:

调用RegexObj.Replace(“ subject”,“ replacement”)以在主题字符串上使用正则表达式执行搜索和替换,并用替换字符串替换所有匹配项。 在替换字符串中,可以使用$&将整个正则表达式匹配项插入替换文本中。 您可以使用$ 1,$ 2,$ 3等...将捕获括号之间匹配的文本插入替换文本。 使用$$将单个美元符号插入替换文本中。 要用第一个后​​向引用立即替换,后跟数字9,请使用$ {1} 9。 如果键入$ 19,并且反向引用少于19个,则$ 19将被解释为原义文本,并按原样显示在结果字符串中。 要从命名捕获组插入文本,请使用$ {name}。 不正确地使用$符号可能会产生不希望的结果字符串,但绝不会引发异常。

来自http://www.regular-expressions.info/dotnet.html

我发现您的正则表达式存在问题,即不匹配的[字符。 以下工作正常:

\|(?<month>\d{2})/(?<day>\d{2})/(?<year>\d{2})\|

这将对月,日和年结果进行分组。 然后,您可以用以下字符串替换:

|$1/$2/20$3|

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM