当前位置: 首页 > 知识库问答 >
问题:

Java regex捕获组索引

胥承
2023-03-14

我有下面的台词,

typeName="ABC:xxxxx;";
Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

所以,如果我再加上两个括号,比如\\s*(\d*)(.*):那么,会有两个组吗?组(1)将返回(\d*)部分,而组(2)返回(.*)部分?

代码段是为了澄清我的困惑而给出的。不是我处理的代码。上面给出的代码可以用string.split()以更简单的方式完成。

共有1个答案

魏朗
2023-03-14

捕获组(pattern)创建具有捕获属性的组。

您可能经常看到(并使用)的一个相关的方法(?:pattern),它创建一个没有capturing属性的组,因此命名为non-capturing group。

当您需要重复一系列模式时,通常会使用组,例如(\.\w+)+,或者指定交替生效的位置,例如^(0*11*0)$(^,然后0*11*0),与^0*11*0$(^0*11*0$)相比较。

除了分组之外,捕获组还将记录捕获组(pattern)中的模式匹配的文本。使用您的示例,(.*):.*匹配abc:匹配:,并且由于.*位于捕获组(.*)中,因此为捕获组1记录文本abc

整个模式被定义为组号0。

模式中的任何捕获组都从1开始索引。索引由捕获组的括号开头的顺序定义。作为一个例子,下面是下面模式中的所有5个捕获组:

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
|     |                       |          | |      |      ||       |     |
1-----1                       |          | 4------4      |5-------5     |
                              |          3---------------3              |
                              2-----------------------------------------2

在其他regex类型(PCRE、Perl)中,它们也可以用于子例程调用

您可以使用matcher.group(int group)访问特定组匹配的文本。组号可以用上面所述的规则来标识。

在某些regex版本(PCRE,Perl)中,有一个分支重置特性,它允许您使用相同的数字来捕获交替的不同分支中的组。

命名捕获组仍然使用相同的编号方案编号,因此也可以通过matcher.group(int group)访问它们。

在内部,Java的实现只是从名称映射到组号。因此,不能对2个不同的捕获组使用相同的名称。

 类似资料:
  • 模式的一部分可以用括号括起来 (...)。这称为“捕获组(capturing group)”。 这有两个影响: 它允许将匹配的一部分作为结果数组中的单独项。 如果我们将量词放在括号后,则它将括号视为一个整体。 示例 让我们看看在示例中的括号是如何工作的。 示例:gogogo 不带括号,模式 go+ 表示 g 字符,其后 o 重复一次或多次。例如 goooo 或 gooooooooo。 括号将字符组

  • 问题内容: 我有以下一行, 我需要拿这个词ABC, 我写了以下代码片段, 所以,如果我说得到,ABC:但是如果我说是ABC,那么我想知道 这是什么和意味着什么呢?如果有人可以用很好的例子向我解释,那会更好。 正则表达式模式中包含一个:,为什么结果忽略了它?组1是否检测到括号内的所有单词? 因此,如果我再加上两个括号,例如:,那么会有两个小组吗?group(1)将退还零件并退还零件? 给出该代码段的

  • 在上一节中,学习了每次如何把量词放在一个字符、字符类或者捕获组中。到目前为止,还没有详细地讨论过捕获组的概念。 捕获组(capturing group)是将多个字符作为单独的单元来对待的一种方式。构建它们可以通过把字符放在一对圆括号中而成为一组。例如,正则表达式(dog)建了单个的组,包括字符“d”“o”和“g”。匹配捕获组输入的字符串部分将会存放于内存中,稍后通过反向引用再次调用。(在 6.2

  • 分组 使用(表达式)对表达式进行分组,例如使用(\d{3}\.){2}匹配下面例子中的数字: abc123.456.def \d{3}表示三个数字,(\d{3}\.)表示三个数字加“.”为一组,{2}表示这一组内容重复两次 捕获 在对表达式进行分组的时候,会捕获文本到自动命名的组里,使用\1 \2 …… 后向引用组 例如用([a-z]*)\ (\d*)匹配下列文本,([a-z]*)为\1组,(

  • 捕获组是将多个字符视为一个单元的一种方法。 它们是通过将要分组的字符放在一组括号中来创建的。 例如,正则表达式(dog)创建包含字母“d”,“o”和“g”的单个组。 捕获组通过从左到右计算它们的左括号来编号。 在表达式((A)(B(C)))中,例如,有四个这样的组 - ((A)(B(C))) (A) (B(C)) (C) 要查找表达式中存在多少个组,请在匹配器对象上调用groupCount方法。

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。