加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中处理重复的正则表达式组名称(C#转换)

发布时间:2020-12-15 02:18:18 所属栏目:Java 来源:网络整理
导读:我试图将一部分C#代码翻译成 Java,虽然我对两者都很熟悉,但我对正则表达式库并不是很强. From MSDN,他们举了这个例子 String pattern = @"D+(?digitd+)D+(?digitd+)?"; 这个输出(我看到他们使用的是捕获索引,而不是组名本身) Match: abc123def456 Group
我试图将一部分C#代码翻译成 Java,虽然我对两者都很熟悉,但我对正则表达式库并不是很强.

From MSDN,他们举了这个例子

String pattern = @"D+(?<digit>d+)D+(?<digit>d+)?";

这个输出(我看到他们使用的是捕获索引,而不是组名本身)

Match: abc123def456
   Group 1: 456
      Capture 0: 123
      Capture 1: 456

有了这个说明

a group name can be repeated in a regular expression. For example,it is possible for more than one group to be named digit,as the following example illustrates. In the case of duplicate names,the value of the Group object is determined by the last successful capture in the input string.

所以也许这是一个糟糕的例子(因为我的实际代码不使用数字),但无论如何……

将其翻译成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内重复的内部内容,而不是我可以在其上粘贴重复修饰符的东西.

我知道拥有相同名称的群体是没有意义的,因为它会如何知道你想要什么?

所以,问题是 – 我能做些什么呢?
使用Matcher.group(int)我唯一的选择并放弃组名?

解决方法

如果我至少正确理解了问题,你就不能用正则表达式做到这一点.如果您可以提供一些数据,示例数据会很有帮助.

第一

"(?<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个值

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读