Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式查找点_C#_Regex - Fatal编程技术网

C# 使用正则表达式查找点

C# 使用正则表达式查找点,c#,regex,C#,Regex,我有六个点 1: ([37.788353, -122.387695], [37.829853, -122.294312]) 2: ([37.429615, -122.087631], [37.487391, -122.018967]) 3: ([37.474858, -122.131577], [37.529332, -122.056046]) 4: ([37.532599,-122.218094], [37.615863,-122.097244]) 5: ([37.516262,-122.19

我有六个点

1: ([37.788353, -122.387695], [37.829853, -122.294312]) 2: ([37.429615, -122.087631], [37.487391, -122.018967]) 3: ([37.474858, -122.131577], [37.529332, -122.056046]) 4: ([37.532599,-122.218094], [37.615863,-122.097244]) 5: ([37.516262,-122.198181], [37.653383,-122.151489]) 6: ([37.504824,-122.181702], [37.633266,-122.121964])
我想通过正则表达式提取它们

(\d+:\s([\d+.\d+,\s-*\d+.\d+],\s[\d+.\d+,\s-*\d+.\d+]))
但它不起作用。任何帮助都将不胜感激。我可以使用组在列表中放置点

预期结果:

[37.788353, -122.387695], [37.829853, -122.294312]
[37.429615, -122.087631], [37.487391, -122.018967]
 ....
给你:

\[[\d-.]+[, ]+[\d-.]+\][, ]+\[[\d-.]+[, ]+[\d-.]+\]
[\d-.]匹配任何数字,并允许使用减号和小数(如果存在) [,]检查x和y坐标之间是否有逗号和空格 输出将按您希望的方式提取点,例如[37.788353,-122.387695],[37.829853,-122.294312]作为第一个点,依此类推

注意:如果您想单独提取数字,您可以使用捕获组,如下所示

\[([\d-.]+)[, ]+([\d-.]+)\][, ]+\[([\d-.]+)[, ]+([\d-.]+)\]
假设点的格式为x1、y1、x2、y2,则 -$1或第一个捕获组将具有x1点37.788353 -$2或下一组为y1-122.387695 -$3或下一组将有x2 37.829853 -$4或下一组为y2-122.294312

包括捕获组

:


它不起作用的原因是你没有逃走,[]。这些在正则表达式语言中具有特殊意义

此外,还有一个错误-您没有将*用于“,”之后的空格,因此只有前3项匹配

以下解决了这些问题:

(\d+\:\s\(\[\d+.\d+,\s*-*\d+.\d+\],\s\[\d+.\d+,\s*-*\d+.\d+\]\))

您可以使用更简单的正则表达式来提取成对的值:

\[(?<first>[-\d.]+)\s*,\s*(?<second>[-\d.]+)]
输出:

[37.788353, -122.387695]
[37.829853, -122.294312]
[37.429615, -122.087631]
[37.487391, -122.018967]
[37.474858, -122.131577]
[37.529332, -122.056046]
[37.532599, -122.218094]
[37.615863, -122.097244]
[37.516262, -122.198181]
[37.653383, -122.151489]
[37.504824, -122.181702]
[37.633266, -122.121964]

您试图以什么格式获取输出?您可以使用。提供一个预期输出的示例。您可以使用正则表达式,但只解析JSON并获取值[并]生成一个字符类更为合理。所以你的意思是我必须将escape添加到或[。@Bigeyes看看这个演示:。答案中包含了代码
var pat = @"\[(?<first>[-\d.]+)\s*,\s*(?<second>[-\d.]+)]";
var s = "1: ([37.788353, -122.387695], [37.829853, -122.294312]) 2: ([37.429615, -122.087631], [37.487391, -122.018967]) 3: ([37.474858, -122.131577], [37.529332, -122.056046]) 4: ([37.532599,-122.218094], [37.615863,-122.097244]) 5: ([37.516262,-122.198181], [37.653383,-122.151489]) 6: ([37.504824,-122.181702], [37.633266,-122.121964])";
var res = Regex.Matches(s, pat)
        .Cast<Match>()
        .Select(m => new[] { m.Groups["first"].Value, m.Groups["second"].Value } );
foreach (var str in res)
{
    Console.WriteLine("[{0}, {1}]", str[0], str[1]);
}
[37.788353, -122.387695]
[37.829853, -122.294312]
[37.429615, -122.087631]
[37.487391, -122.018967]
[37.474858, -122.131577]
[37.529332, -122.056046]
[37.532599, -122.218094]
[37.615863, -122.097244]
[37.516262, -122.198181]
[37.653383, -122.151489]
[37.504824, -122.181702]
[37.633266, -122.121964]