我需要识别(潜在嵌套)在正则表达式中捕获组并创建树.特定目标是Java-1.6,我理想地喜欢Java代码.一个简单的例子是: "(a(b | c)d(e(f*g))h)" 将解释为 "a(b|c)d(e(f*g))h" ... "b|c" ... "e(f*g)" ... "f*g" 理想情况下,解决方案应解释计数表达式,量词等和逃逸水平.但是,如果这不容易找到更简单的方法可能就足够了,因为我们可以限制所使用的语法. 编辑.澄清.我想解析正则表达式字符串本身.要这样做,我需要知道BNF或Java 1.6 Regexes的BNF或同等标准.我希望有人已经做到了. 结果的副产品将是该过程将测试正则有效性. 解决方案 考虑加入实际解析器/lexer: 看起来很复杂,但是如果您的语言相当简单,则相当简单.如果不是这样,在以下方面进行操作可能会使您的生活成为地狱:) 其他解决方案 我想出了使用XML工具(XOM, http:///wwww
以下是关于 capture-group 的编程技术问答
我试图在文本的每个块中匹配五个子字符串(总共有100个块). 我匹配了99%的文本块,但有关第3和4组的错误. 这是一个演示链接:第3组是"语音的部分",第4组是英语翻译. 在文本的第一个块中,det, pro都应在第3组中,然后the; him, her, it, them应在第4组中. 同一问题再次发生在文本的第三个块中. 第3组应为adj, det, nm, pro,第4组应为a, an, one. 这是我的模式: ([0-9]+)\s+(\w+(?:, \w+)?)\s+(\N+?)\s+(\H.+).*?\r?\n•\s+([\s\S]*?)\s+[0-9]+\s\|.*\s* 解决方案 voici ... /^(\d+) +(\w+) +([acdefijlmnoprtv()]+(?:, ?[acdefijlmnoprtv()]+)*) +([\S\s]+?)\n\x{2022} +([\S\s]+?)\n\d+ \| [-\
为什么此代码仅吐出整个正则匹配而不是捕获组? 输入 @"A long string containing Name: A name here amongst other things" 输出预期 A name here 实际输出 Name: A name here 代码 NSString *htmlString = @"A long string containing Name: A name here amongst other things"; NSRegularExpression *nameExpression = [NSRegularExpression regularExpressionWithPattern:@"Name: .*\">(.*) " options:NSRegularExpressionSearch error:nil];
运行此代码时: print re.search(r'1', '1').groups() 我得到()的结果.但是,.group(0)给了我比赛. 不应该给我一些包含比赛的东西吗? 解决方案 组为空,因为您没有任何捕获组 - docs.python.org/library/re.html#re.matchobject.groups . (0)始终将返回匹配的整个文本,无论是否在组中捕获 编辑. 其他解决方案 据我所知,.groups()返回了记住的组的元组. IE.括号中封闭的正则表达式中的那些组.因此,如果您要写: print re.search(r'(1)', '1').groups() 您会得到 ('1',) 作为您的回复.通常,.groups()将返回括号内的正则表达式中所有对象组的元组. 其他解决方案 这样做的原因是您没有捕获组(因为您不在模式中使用()). http://docs.pypython.org/lib
我有以下文本文件,我想解析以获取单个字段: host_group_web = ( ) host_group_lbnorth = ( lba050 lbhou002 lblon003 ) 我想提取的字段是粗体 host_group_ web =() host_group_ lbnorth =( lba505 lbhou002 lblon003 ) ) host_group_web在()之间没有任何项目,因此将忽略部分 我将第一组命名为节点,而()之间的项目为 nodes 我正在按行读取文件,并存储结果以进行进一步处理. 在Golang中,这是我正在使用的正则片段: hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )" hostGroupExp := regexp.MustCompile(`host_group_(?P[[:alnum:]
介绍 (如果... 对Intros感到无聊,可以跳至) 这个问题并不针对VBScript(在这种情况下我只是使用过):我想找到一种用于一般正则表达式用法的解决方案(包括编辑器). 我想创建 示例4的适应在MS Excel 中. 我需要捕获一个整个模式,然后在其中捕获其他3种模式.但是,以相同的表达方式,我还需要捕获另一种模式,然后再次捕获其中的其他3种模式(是的……但是,在指向Nutjob手指之前,请完成阅读). 我首先想到命名为捕获群体我意识到我不应该«命名和编号捕获组的混合»,因为不建议使用«,因为风味在组编号的方式上不一致». . 然后,我研究了For Each C In Myrange strPattern = "(?:^([0-9]+);([0-9]+);([0-9]+)$|^.*:([0-9]+)\s.*:([0-9]+).*:([a-zA-Z0-9]+)$)" If strPattern "" Then strInput = C.Value
在R中,是否可以从正则表达式匹配中提取组捕获?据我所知,没有一个grep,grepl,regexpr,gregexpr,sub或gsub返回组捕获. 我需要从编码的字符串中提取键值对: \((.*?) :: (0\.[0-9]+)\) 我总是只能做多个全匹配的GREP,或者在外部(非R)处理中进行一些操作,但是我希望我可以在R中完成所有操作.这样吗? 解决方案 str_match(),来自 stringr stringr stringr 包,将执行此操作.它在比赛中的每个组返回一个带有一个列的字符矩阵(整个比赛中一个): > s = c("(sometext :: 0.1231313213)", "(moretext :: 0.111222)") > str_match(s, "\\((.*?) :: (0\\.[0-9]+)\\)") [,1] [,2] [,3] [
我将基于增强的正则表达式转换为C ++ 11 Regex.我有一个名为url的捕获组: \s*?=\s*?(("(?.*?)")|('?.*?)')) 使用Boost,如果您有一个smatch,则可以调用match.str("url")以按名称获取捕获组.使用std::smatch,我只看到索引子匹配. 如何使用std :: smatch类访问URL捕获? 解决方案 您不能用C ++ 11标准命名捕获组. C ++ 11 Regex符合Ecmascript语法.这是一个链接,可以解释所有 ecmascript/.即使您考虑到真正的正则表达式,这可能会令人失望,这将是额外的.
如果有人可以帮助,我正在尝试使用正则表达式和捕获组进行SED附加,但它不完全工作: echo "#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/" | sed -re '/#baseurl=http:\/\/mirror.centos.org(.*)/a baseurl=https:\/\/10.10.10.10\ \1' #baseurl=http://mirror.centos.org/centos//contrib// baseurl=https://10.10.10.10 1 目前它只是给出了文字值1而不是捕获组. 它应该给: #baseurl=http://mirror.centos.org/centos//contrib// baseurl=https://10.10.10.10/centos//contrib// 我还尝试了反斜杠括号,但它不起作用
我试图弄清楚如何在以下URL字符串中重复comma-separated值上的捕获组: id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523; 我正在使用此RegExp,这是我想要的返回结果,除了值,因为它们是动态的.可能是URL参数中的2,3,4等用户,并且想知道我是否可以为每个值创建一个捕获组,而不是user1,user2,user3作为一个捕获组. regexp: (^|;|:)(\w+)=([^;]+)* 这是使用 regexp 示例输出: group1-(半柱,结肠) group2-(键,即id,名称,城市,zip) group3-(value1) group4-(value2) *如果存在 group5-(value3) *如果存在 group6-(value4) *如果存在 等...基于我之前所解释的动态值. 问题:
我发布了 this /p> 但这还不是结束. 在那里适用的所有规则仍然适用. 所以字符串: "%ABC%"结果会产生ABC(捕获百分比之间的东西) 和"$ABC."一样($后捕获$,在出现另一美元或点时放弃) "$ABC$XYZ"也会给出XYZ. 为此添加更多: "${ABC}"也应该产生ABC. (如果存在,请忽略卷曲牙套 - 也许是非捕获字符?). 如果您有两个连续的美元标志,例如"$$EFG"或"$${EFG}", 那应该不是出现在正则结果中. (这是编号或命名后参考的地方 - 我将它们视为非捕捉组的原因).据我了解,该组成为具有此语法(?:)的非捕捉组. 1)我可以说%还是$是一个非捕捉组,并按数字引用该组?还是仅捕获组获得分配的数字? 2)如果您有((A) (B) (C)),则编号的顺序是多少.外部组1,A 2,B 3 C 4? 是 我一直在看命名组.查看提到的语法在这里 (?capturing text)定义
我正在使用Java的正则库.我想根据以下格式验证一个字符串: 31,5,46,7,86(...) 数量尚不清楚.我想确保该字符串中至少有一个数字,并且每两个数字都由逗号分隔.我也想从字符串中获取数字. (注意:这只是一个简化的示例,字符串.Split不会解决我的实际问题) 我写下了以下言论: ({[0-9]++)((?:,[0-9]++)*+) 验证部分有效.但是,当我尝试提取数字时,我得到2组: Group1: 31 Group2: ,5,46,7,86 REGEX101版本: https://regex101.com/r/xj5oq6/3 p> 有没有办法分别获得每个数字?即最终获得集合: [31, 5, 46, 7, 86] 预先感谢. 解决方案 Java不允许您访问重复捕获组的各个匹配项.有关更多信息,请查看以下问题:正则表达式 - 捕获所有重复组/p> Tim Pietzcker提供的代码也可以帮助您.如果您对其进
我尝试编写一个正则表达式以在Java程序中使用,该程序将识别可能出现在输入中的模式未知次数.我愚蠢的小例子是: String patString = "(?:.*(h.t).*)*"; 然后,我尝试通过通过matcher.group(i)循环循环访问"小屋是热"等线的匹配.它仅记得最后一场比赛(在这种情况下,"热"),因为只有一个捕获组 - 我猜想了Matcher.group(1)在重复使用捕获组时被覆盖.不过,我想要的是某种包含 " hut"和" hot"的数组. 有更好的方法吗? fwiw,我真正要做的是在信号词之后拿起所有(可能是多词)专有名词,其中可能还有其他单词和标点符号.因此,如果"锯"是信号,我们有"我看到鲍勃和约翰·史密斯和他的妻子玛格丽特,"我想要{"鲍勃","约翰·史密斯","玛格丽特"}. 解决方案 (类似的问题:带有可变数字的正则表达式组?) 这是不可能的.您最好的替代方法是使用h.t,并使用 while (matcher.f
Java(也许还有一个其他开源库)是否有办法识别java.util.regex.Pattern中的捕获组(即在创建匹配器之前) java文档的示例: 捕获组编号 计算他们的开头括号 从左到右.在表达中 ((a)(b(c))),例如 四个这样的组: 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) 原则上应该可以从(编译)模式中识别它们. 更新: 从@Leniel和Eslewhere开始,似乎该设施("命名组")将于2011年中期出现在Java 7中.如果我不知道我不确定API是什么,我迫不及待地使用Jregex. 解决方案 您可以通过创建虚拟匹配器来找到组的数字,例如: Pattern p = Pattern.compile("((A)(B(C)))"); System.out.println(p.matcher("").groupCount()); 如果您想
可选的非捕获组是多余的吗? 是以下言论: (?:wo)?men 语义上等同于以下正则态度? (wo)?men 解决方案 您的(?:wo)?men和(wo)?men在语义上是等效的,但从技术上讲是不同的,即,第一种是使用非捕获和另一个捕获组.因此,问题是为什么当我们捕获? 时,为什么使用非捕获组 非相关组有时会有所帮助. 避免过多的反应(请记住,有时很难使用高于9的反应) 为了避免99个编号的反应限制(通过减少编号捕获组的数量)(来源:To 减少由存储在堆栈中的捕获引起的开销 我们可以在不破坏捕获组的顺序的情况下向现有的正则添加更多分组. 另外,它只是使我们的比赛变得清洁/p> 您可以使用非捕获组来保留组织或分组福利,但没有捕获的开销. 重新输入现有的正则表达式将捕获捕获转换为非捕捉组似乎不是一个好主意,因为它可能会破坏代码或需要太多努力. 其他解决方案 其他地方的一个问题也是如此,我在Python中提供了一个示例的答案:
我想拥有可以是可选的多个捕获组,我想访问它们对应的字符串. 看起来像这样的东西: let text1 = "something with foo and bar" let text2 = "something with just bar" let regex = NSRegularExpression(pattern: "(foo)? (bar)") for (first?, second) in regex.matches(in:text1) { print(first) // foo print(second) // bar } for (first?, second) in regex.matches(in:text2) { print(first) // nil print(second) // bar } 解决方案 用NSRegularExpression检索捕获的潜台词并不容易. 首先,matches(in:range:)的
我正在移植一个从Ruby到Go的库,并且刚刚发现Ruby中的正则表达式与GO不兼容(Google RE2).引起我的注意,Ruby&Java(加上其他语言使用PCRE正则表达式(Perl兼容,支持捕获组)),因此我需要重写我的表达式,以便它们在GO中编译. 例如,我有以下言论: `(?\d{4})-(?\d{2})-(?\d{2})` 这应该接受输入,例如: 2001-01-20 捕获小组允许将年度,月和日捕获成变量.要获得每个组的价值,这很容易;您只需将带有组名称的返回的匹配数据索引,然后将其归还值.因此,例如,要获得一年,类似伪代码的东西: m=expression.Match("2001-01-20") year = m["Year"] 这是我在表达式中经常使用的模式,所以我要重写很多. 因此,是否有一种方法可以在GO Regexp中获得这种功能;我应该如何重写这些表达式? 解决方案 我应该如
我是一个正则表达式新手,我无法弄清楚如何编写单个正则表达式,该表达式将"匹配"任何重复的连续单词,例如: 巴黎在 春季. 不是那是相关的. 你为什么要笑? 我的我的我的正则表达不好? 是否有单个正则表达式可以匹配上面的所有粗字符串? 解决方案 尝试此正则表达式: \b(\w+)\s+\1\b 这里\b是一个单词边界,\1引用了第一组的捕获匹配. REGEX101示例在这里 其他解决方案 我相信这条正则可以处理更多情况: /(\b\S+\b)\s+\b\1\b/ 可以在此处找到很多测试字符串: .com/Regex-tuesday/挑战1.html 其他解决方案 以下表达式应正确工作以找到任何数量的重复单词.匹配可能是不敏感的. String regex = "\\b(\\w+)(\\s+\\1\\b)+"; Pattern p = Pattern.compile(regex, Pattern.CASE_INS
String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. Matcher m = r.matcher(line); if (m.find()) { System.out.println("Found value: " + m.group(1)); System.out.println("Found value: " + m.group(2)); System.out.println("Found value: " + m.group(3)); } 输出是 Found value:
我正在将一个库从 Ruby 移植到 Go,并且刚刚发现 Ruby 中的正则表达式与 Go (google RE2) 不兼容.我注意到 Ruby &Java(加上其他语言使用 PCRE 正则表达式(perl 兼容,支持捕获组)),所以我需要重新编写我的表达式,以便它们在 Go 中编译正常. 例如,我有以下正则表达式: `(?\d{4})-(?\d{2})-(?\d{2})` 这应该接受如下输入: 2001-01-20 捕获组允许将年、月和日捕获到变量中.要得到每个组的值,很容易;您只需使用组名索引返回的匹配数据,然后返回值.因此,例如要获取年份,类似于以下伪代码: m=expression.Match("2001-01-20") year = m["Year"] 这是我在表达中经常使用的模式,所以我有很多重写工作要做. 那么,有没有办法在 Go 正则表达式中获得这种功能?我应该如何重写这些表达式? 解决方案 我应