[英]C# RegEx string extraction
I have a string: 我有一个字符串:
"ImageDimension=655x0;ThumbnailDimension=0x0".
“ImageDimension = 655x0; ThumbnailDimension =为0x0”。
I have to extract first number ("655" string) coming in between "ImageDimension=" and first occurrence of "x" ; 我必须提取“ImageDimension =”和第一次出现“x”之间的第一个数字(“655”字符串); and need extract second number ("0" string) coming after first "x" occurring after "ImageDimension=" string.
并且需要在“ImageDimension =”字符串之后的第一个“x”之后提取第二个数字(“0”字符串)。 Similar with third and fourth numbers.
与第三和第四个数字相似。
Can this be done with regex ("ImageDimension= ? x ? ;ThumbnailDimension= ? x ? ") and how ? 这可以用正则表达式完成(“ImageDimension = ? x ? ; ThumbnailDimension = ? x ? ”)以及如何完成? Instead of clumsy substrings and indexof ?
而不是笨拙的子串和索引? Thank you!
谢谢!
My solution which is not nice : 我的解决方案不太好:
String configuration = "ImageDimension=655x0;ThumbnailDimension=0x0";
String imageDim = configuration.Substring(0, configuration.IndexOf(";"));
int indexOfEq = imageDim.IndexOf("=");
int indexOfX = imageDim.IndexOf("x");
String width1 = imageDim.Substring(indexOfEq+1, indexOfX-indexOfEq-1);
String height1 = imageDim.Substring(imageDim.IndexOf("x") + 1);
String thumbDim = configuration.Substring(configuration.IndexOf(";") + 1);
indexOfEq = thumbDim.IndexOf("=");
indexOfX = thumbDim.IndexOf("x");
String width2 = imageDim.Substring(indexOfEq + 1, indexOfX - indexOfEq-1);
String height2 = imageDim.Substring(imageDim.IndexOf("x") + 1);
This will get each of the values into separate ints for you: 这将使每个值成为单独的int:
string text = "ImageDimension=655x0;ThumbnailDimension=0x0";
Regex pattern = new Regex(@"ImageDimension=(?<imageWidth>\d+)x(?<imageHeight>\d+);ThumbnailDimension=(?<thumbWidth>\d+)x(?<thumbHeight>\d+)");
Match match = pattern.Match(text);
int imageWidth = int.Parse(match.Groups["imageWidth"].Value);
int imageHeight = int.Parse(match.Groups["imageHeight"].Value);
int thumbWidth = int.Parse(match.Groups["thumbWidth"].Value);
int thumbHeight = int.Parse(match.Groups["thumbHeight"].Value);
var groups = Regex.Match(input,@"ImageDimension=(\d+)x(\d+);ThumbnailDimension=(\d+)x(\d+)").Groups;
var x1= groups[1].Value;
var y1= groups[2].Value;
var x2= groups[3].Value;
var y2= groups[4].Value;
var m = Regex.Match(str,@"(\d+).(\d+).*?(\d+).(\d+)");
m.Groups[1].Value; // 655 ....
(\d+)
Get the first set of one or more digits. 获取第一组一个或多个数字。 and store it as the first captured group after the entire match
并在整场比赛后将其存储为第一个被捕获的组
.
Match any character 匹配任何角色
(\d+)
Get the next set of one or more digits. 获取下一组一个或多个数字。 and store it as the second captured group after the entire match
并在整场比赛后将其存储为第二个被捕获的组
.*?
match and number of any characters in a non greedy fashion. 以非贪婪的方式匹配和任何字符的数量。
(\d+)
Get the next set of one or more digits. 获取下一组一个或多个数字。 and store it as the third captured group after the entire match
并在整场比赛后将其存储为第三个被捕获的组
(\d+)
Get the next set of one or more digits. 获取下一组一个或多个数字。 and store it as the fourth captured group after the entire match
并在整场比赛后将其存储为第四个被捕获的组
Since a lot of people already gave you what you wanted, I will contribute with something else. 由于很多人已经给了你想要的东西,我会用别的东西做出贡献。 Regexes are hard to read and error prone.
正则表达式难以阅读且容易出错。 Maybe a little less verbose than your implementation but more straightforward and friendly than using regex:
也许比你的实现更简洁,但比使用正则表达式更直接和友好:
private static Dictionary<string, string> _extractDictionary(string str)
{
var query = from name_value in str.Split(';') // Split by ;
let arr = name_value.Split('=') // ... then by =
select new {Name = arr[0], Value = arr[1]};
return query.ToDictionary(x => x.Name, y => y.Value);
}
public static void Main()
{
var str = "ImageDimension=655x0;ThumbnailDimension=0x0";
var dic = _extractDictionary(str);
foreach (var key_value in dic)
{
var key = key_value.Key;
var value = key_value.Value;
Console.WriteLine("Value of {0} is {1}.", key, value.Substring(0, value.IndexOf("x")));
}
}
Sure, it's pretty easy. 当然,这很容易。 The regex pattern you're looking for is:
您正在寻找的正则表达式模式是:
^ImageDimension=(\d+)x0;.+$
The first group in the match is the number you want. 匹配中的第一组是您想要的数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.