s = "1 2 ";
StringCases[s, (n : NumberString ~~ " ") .. ]
StringCases[s, (NumberString ~~ " ") .. ]
yields
{"1 ", "2 "}
{"1 2 "}
Why?
Patterns get confusing quickly. If you name a pattern you're imposing more restrictions on that pattern that are sometimes difficult to follow. Using your example,
s = "1 2 ";
StringCases[s, (n : NumberString ~~ " ") .. ]
StringCases[s, (NumberString ~~ " ") .. ]
In the first case you're telling string cases to match n
, where n must be a number string and to continue the pattern for any match with the parenthetical statement repeated. In the repeated suffix n must always be the same number!
In the second case you're specifying that any repeated pattern of NumberString+Whitespace should match. Since you haven't named the number string, the pattern still applies generally to any number.
Trying
s = "1 1 1 2 2";
StringCases[s, (n : NumberString ~~ " ") .. ]
StringCases[s, (NumberString ~~ " ") .. ]
Will give:
{1 1 1 , 2 2 }
{1 1 1 2 2 }
Which shows that the first pattern works any time the integer following the white space is the same as the n that triggered the match.
{MatchQ[{1, 1, 2}, {x_Integer ..}], MatchQ[{1, 1, 2}, {_Integer ..}]}
.
$\endgroup$
Commented
Jun 16, 2015 at 16:36
{x_Integer..}
it is completely clear and I use it all of the time.
$\endgroup$
Commented
Jun 16, 2015 at 16:36
(n : NumberString)
, what happens? $\endgroup$n
be set to if the second case was the result? $\endgroup$n
in the first situation you are specifying that only patterns of the form(n~~" ")..
will match, where the repeating element must contain the same numbern
. Since 2!=1 you don't match any further. In the second case you allow any number digit in the repeated part of the pattern. Try matching1 1
. $\endgroup$