REGEX:LineString(地理位置)作为命名捕获组,并匹配行前缀

z9zf31ra  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(124)

我输入了文本行,其中一些包含对象的相关GeoData。我想通过匹配给定前缀(将以下坐标标识为属于所需Geo-Object)来标识相关行。
它可能类似于以下内容:
/带有不相关前缀的行
/行带有不相关的前缀,可能还包含坐标
[相关前缀][字符串][1到X坐标,格式为“lat:X.XXXXXX,lon:X.XXXXXX”][其他字符串][其他潜在相关信息]
/带有不相关前缀的行
/带有不相关前缀的行
我想要提取的实际数据是坐标字符串(LineString)的形式,以便生成一个表示LineString的对象,以便在我的C#代码中进一步使用。其他属性(例如名称或ID)可能也是相关的。但是,我还想取消可能包含坐标但不包括相关前缀的行的资格。
根据我的理解,我可以在Regex中使用命名捕获组从相关行中获取子字符串作为“变量”,如下所示(请不要介意坐标的不精确格式):

(lat=(?<lat>\d{0,2}[.,]\d+)), (lon=(?<lon>\d{0,2}[.,]\d+))

但是,就我所知,我无法使表达式与直线中任意数量的坐标匹配(因为我不知道LineString对象的长度),同时使表达式与前缀模式匹配。
有没有一种解决方案可以让表达式匹配前缀,为任意多对坐标命名捕获组,并为潜在相关的其他变量命名捕获组?
假设我有下面这行代码:

PREFIXafkzh(lat=34.42344, lon=23.6346jsdfkh,lat=2.4234, lon=12.124)

我试过下面的正则表达式:

(lat=(?<lat>\d{0,2}[.,]\d+)), (lon=(?<lon>\d{0,2}[.,]\d+))

这将匹配所有坐标,但不匹配前缀

(PREFIX).\*(lat=(?<lat>\d{0,2}[.,]\d+)), (lon=(?<lon>\d{0,2}[.,]\d+))
(PREFIX).\*((lat=(?<lat>\d{0,2}[.,]\d+)), (lon=(?<lon>\d{0,2}[.,]\d+)))+

这两个都只会匹配行中的最后一个坐标。

tf7tbtn2

tf7tbtn21#

要知道你有什么样的前缀,以及是否有一个用于直线的前缀和另一个用于一组坐标的前缀并不容易,你可能需要添加一些输入数据的例子。
我知道你有一个前缀的行后面是一个(然后一些坐标,也可以前缀一个词和一个逗号
假设是这样,我得出了这个 .NET 正则表达式:

@"(?<line_prefix>\w+)\(          # Line word prefix followed by (.
(?:                              # Non-capturing group to match multiple coords.
  (?<coord_prefix>[\w,]*)        # Optional coord prefix (may have to adapt).
  (?:lat=(?<lat>\d{0,2}[.,]\d+)) # Latitude value.
  ,\s*                           # Comma and optional spaces.
  (?:lon=(?<lon>\d{0,2}[.,]\d+)) # Longitude value.
)+"gx

您可以在这里测试:https://regex101.com/r/vxjeww/3
您可能需要调整线前缀和坐标前缀样式,因为我们不清楚它可以包含什么。
如您所见,您应该得到多个变量,因为非捕获组可以匹配1次或多次。

相关问题