/ / iterate съвпадения в неназовани групи - .net, regex, asp.net-4.0

итерират съвпадения в неназовани групи - .net, regex, asp.net-4.0

дадена проста RegEx така: ^(d+D+d+)(.*) и низ за разбор като 15-APR-2012 @ 11:00:00 с помощта на [$1]$2 добиви [15-APR-2012] @ 11:00:00 както се очаква.

Проблемът ми е, че се обаждам на Regex.Matches на това получавам един мач в индекс 0 и целия низ: 15-APR-2012 @ 11:00:00 се показва като съвпадение. Но наистина има 2 мача. Как мога да получа и двата мача? Трябва да видя индекс 0 и индекс 12. Кодът, който използвам, е от друга нишка:

// Get a collection of matches.
MatchCollection matches = Regex.Matches(inPutString, regexptrn);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
retVal += String.Format("Index={0}, Value={1}", capture.Index, capture.Value) + Environment.NewLine;
}
}

Имам ли грешна представа за това какво наистина прави?


ДОБРЕ. това е същия низ, нов regex "(..) (...)", който замества с [$ 1] {$ 2} резултати в [10] {- AU} [G -] {201} [2] {@ 1} [1:] {45:} 38 очакваме това.

Мачовете обаче дават следното:

Index=0, Value=10-AU
Index=5, Value=G-201
Index=10, Value=2 @ 1
Index=15, Value=1:45:

Това показва, че мачовете разглеждат целия модел, а НЕ неговите групи. Сега как да получим мачове от групата

Отговори:

1 за отговор № 1

Има две причини, поради които настоящият регулярен израз никога не може да получи няколко съвпадения:

  • Най- ^ в началото на вашия regex е котва към началото на низ, така че трябва да премахнете това, в противен случай regex може да съвпада само с индекс 0.
  • Най- .* в края на вашето regex ще съответства на останалата частот низа, и няма да намерите никакви припокриващи се съвпадения, така че да можете да съпоставите само веднъж. Тъй като въпреки това не правите нищо с втората група за заснемане, вероятно можете просто да изпуснете това от вашия regex.

... така че опитайте с regex (d+D+d+) и замяна на съвпадения с [$1].