说我有这样的字符串:
07-MAY-07 Hello World 07-MAY-07 Hello Again
所以模式是DD-MMM-YY,其中MMM是一个月的三字母格式。什么正则表达式会将此字符串分解为:
07-MAY-07 Hello World
07-MAY-07 Hello Again
===================
使用下面针对C#修改的Jason代码,
string input = @"07-MAY-07 Hello World 07-MAY-07 Hello Again";
string pattern = @"(\d{2}-[A-Z]{3}-\d{2}\s)(\D*|\s)";
string[] results = Regex.Split(input, pattern);
results.Dump();
Console.WriteLine("Length = {0}", results.Count());
foreach (string split in results)
{
Console.WriteLine("'{0}'", split);
Console.WriteLine();
}
我得到嵌入的空行?
Length = 7
''
'07-MAY-07 '
'Hello World '
''
'07-MAY-07 '
'Hello Again'
''
我甚至不明白为什么我会得到这些空白......?
===========================
好的,我将正则表达式更改为@“(\ d {2} - [A-Z] {3} - \ d {2})”;
现在我在一开始就得到一个空行。很小,但我还是不明白为什么?
长度= 5 ''
'07 -MAY-07'
'Hello World'
'07 -MAY-07'
'Hello Again'
''
另外,由于MMM不能是任何三个字母,有没有办法改变正则表达式,以便强制这三个字母(JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV |?DEC)
答案 0 :(得分:0)
一个简单的正则表达式(不是防弹)将是:
(\d\d-\w\w\w-\d\d .*?(?=(\d\d-\w\w\w-\d\d|$)))
使用另一个匹配或行尾的前瞻来捕获行。
答案 1 :(得分:0)
var str = "07-MAY-07 Hello World 07-MAY-07 Hello Again";
str = str.replace(/(\d{2}-[A-Z]{3}-\d{2}\s)(\D*|\s)/, '$1$2\n');
alert(str);
答案 2 :(得分:0)
答案 3 :(得分:0)
您使用的是哪种语言?在perl中你可以做类似
的事情$s = "07-MAY-07 Hello World 07-MAY-07 Hello Again";
$s =~ s/\s(\d\d-\w\w\w-\d\d)/\n$1/g;
print $s;
结果
07-MAY-07 Hello World
07-MAY-07 Hello Again
答案 4 :(得分:0)
空白行是由regex.Split
方法引起的。第一场比赛是在比赛开始,所以你在阵列中得到一个额外的条目。你可以这样做:
string input = "07-MAY-07 Hello World 07-MAY-07 Hello Again";
Regex regex =
new Regex(
@"(\d{2}-(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-\d{2})(.(?!\d{2}-(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-\d{2}))*",
RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches (input))
{
Console.WriteLine (match.Value);
}
表达式查找您的日期(包括确切的3个字符的月份),然后匹配所有文本,直到下一个日期字符串。下一场比赛应该在上一场比赛后开始。