How does one extract only the formatting part from a string. For example: if I have a string = "Warning: the error {0} has occurred. {1, 9} module has {2:0%} done." I would like to extract {0}, {1,9} and {2:0%} out into a sting array. Is there a regular expression or something that can be done other than my way of looping the string with Substring indexof '{' and '}' alternately?
+1
A:
Will some variant of "\{[^}]+\}" not work? Run it through finding the matches and substring'ing out from start to end of the match.
Colin Burnett
2009-04-30 23:56:09
A:
new Regex(@"\{[0-9:,% .]+\}");
You may have to tweak/tune it to account for any additional formatting options that you haven't provided in your example.
Jordan S. Jones
2009-04-30 23:57:32
A:
In Java, the Matcher class takes a regex and will return all matching sub-strings.
For example:
String str = "Warning: the error {0} has occurred. {1, 9} module has {2:0%} done.";
Matcher matcher = pattern.matcher( "{.*}");
while (matcher.find()){
String matched = matcher.group()
\\do whatever you want with matched
}
e5
2009-05-01 00:07:22
+1
A:
The following code is different from other answers in that it uses non-greedy matching (".*?"):
private static void Main(string[] args) {
const string input = "Warning: the error {0} has occurred. {1, 9} module has {2:0%} done.";
const string pattern = "{.*?}"; // NOTE: "?" is required here (non-greedy matching).
var formattingParts = Regex.Matches(input, pattern).Cast<Match>().Where(item => item.Success).Select(item => item.Groups[0].Value);
foreach (var part in formattingParts) {
Console.WriteLine(part);
}
}
+1 I'd started writing something with named matches to help extract each part individually, but the above stopped me - really nice solution
Terry_Brown
2009-05-01 15:47:43
Except doing [^}] in between { and } prevents it from being greedy. Likewise on [0-9:,% .] that Jordan proposed. Ethan's is the only greedy one that will match "{0} ... {1}" from beginning to end.
Colin Burnett
2009-05-01 20:23:15