在Java中处理重复的正则表达式组名称(C#转换)
我试图将一部分C#代码翻译成
Java,虽然我对两者都很熟悉,但我对正则表达式库并不是很强.
From MSDN,他们举了这个例子 String pattern = @"D+(?<digit>d+)D+(?<digit>d+)?"; 这个输出(我看到他们使用的是捕获索引,而不是组名本身) Match: abc123def456 Group 1: 456 Capture 0: 123 Capture 1: 456 有了这个说明
所以也许这是一个糟糕的例子(因为我的实际代码不使用数字),但无论如何…… 将其翻译成Java,对第二个< digit>并不太高兴. String pattern = "D+(?<digit>d+)D+(?<digit>d+)?" Pattern p = Pattern.compile(pattern); String matchMe = "abc123def456"; 和Pattern.compile中的错误 Named capturing group <digit> is already defined 完全删除除姓氏之外的所有名称将是一个选项,我猜,因为这将“匹配”C#行为. 但是,当我试图将模式嵌套在另一个中时,就会出现这个问题 String x = "(?<InnerData>...)no group(?<InnerGroup>foo)"; String y = "(?<header>[...])some data" + x + "more regex" + x; Pattern.compile(y); 其中x是在y内重复的内部内容,而不是我可以在其上粘贴重复修饰符的东西. 我知道拥有相同名称的群体是没有意义的,因为它会如何知道你想要什么? 所以,问题是 – 我能做些什么呢? 解决方法
如果我至少正确理解了问题,你就不能用正则表达式做到这一点.如果您可以提供一些数据,示例数据会很有帮助.
第一 "(?<header>[...])some data" + x1 + "more regex" + x2 对于您的示例,只要x1和x2是具有不同组名的相同正则表达式,此方法就可以正常工作.但我相信这不是你想要的. 第二 假设字符串:FEW014 BKN025CB 我有3个我感兴趣的参数,让我们说: a可以是OVC,FEW或BKN h可以是任何正好3位数的集合 t可以是CB,TCU或不存在 另外,这些参数中最多可出现4个参数;示例有2,但最多可达4. 现在假设正则表达式(匹配这3个参数): (?P<a>FEW|BKN|OVC)(?P<h>[d]{3})(?P<t>CB|TCU)? 我可以使用正则表达式引擎获取所有这些参数的列表,但引擎不会将它们相互关联. 我会得到类似以下内容: a: FEW BKN h: 014 025 t: CB 看看我是如何失去CB来自哪里的?这是预期的行为,因为正则表达式引擎不保持状态.他们只是将东西塞进桶里. 持续 解决这个问题的方法,就是不要对你的正则表达式贪婪,并匹配相关的东西,存储它们,继续前进. – 我在那里使用的第二个例子是从一个真实案例中偷来的,这个案例已经实施了;为简单起见,只更改了一些名称 FEW014 BKN025CB是文本气象报告的一部分,并按照解释的方式进行解析. 可以帮助您理解这笔交易,以下是执行此操作的代码: @occurs(4) @search(r""" (?P<amount>FEW|SCT|BKN|OVC) (?P<height>[d]{3}|///) (?P<type>CB|TCU|///)? """) def pclouds(item): """Returns ((amount,height,type),) of ((string,int,string),) for clouds or ()""" tcloud = namedtuple('Cloud','amount height type') height = item['height'] if height == '///': height = -1 else: height = int(height) return tcloud(item['amount'],item['type']) https://github.com/pedro2555/avweather/blob/master/avweather/_metar_parsers.py#L221 >搜索装饰器,搜索给定正则表达式的一个实例>发生装饰者,重复搜索给定的次数>调用pclouds函数,通知项只包含一组3个值 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |