匹配 2 个括号内的组
Match groups inside 2 parenthesis
我很难让它发挥作用。我有一个像这样的字符串:
((a 和 b) 而不是 (c 和 d)) 或 ((e 和 f 和 h) 而不是 (c 和 d)) 或 ((h 和 i) 而不是 (k 和 d) ) ......
我需要的是匹配上面的字符串并捕获每两个括号((我的组))之间的文本,例如:
- 第 1 组:((a 和 b)而不是(c 和 d))
- 第 2 组:((e 和 f 和 h)而不是(c 和 d))
- 第 3 组:(c 和 d)) 或 ((h 和 i) 而不是 (k 和 d))
并用 'or' 运算符分隔。
这是我的正则表达式:
(\({2}.+?\){2})(?: (?:or) (\({2}.+?\){2}))+
当我单独使用时,我的正则表达式 (\({2}.+?\){2})
的第一部分匹配两个括号之间的所有组。但是当我添加第二部分以匹配由 'or' (?:or) (\({2}.+?\){2}))+
分隔的所有组时它不起作用 - 它似乎匹配下面的文本是不充分的:
((a and b) and not (c and d)) and ((a and b) and not (c and d))
.
感谢您的帮助
您可以在 Java:
中使用此正则表达式
(?:^|(?!^)\G\h+or\h+)(\(\((?:(?!\)\)).)++\)\))(?=(?:\h+or\h+\(\((?:(?!\)\)).)++\)\))*$)
正则表达式详细信息:
(?:
: 启动一个非捕获组
^
:匹配开始位置
|
: 或
\G\h+or\h+
:从上一场比赛结束开始,比赛or
被1+个空格包围
)
:结束非捕获组
(
: 开始捕获组#1
\(\(
: 比赛开始 ((
(?:(?!\)\)).)++
:匹配任何字符的 1+,只要它前面没有 ))
。 ++
是所有格量词
\)\)
:比赛结束))
)
: 结束捕获组#1
(?=\h+or\h+|$)
:先行断言我们有一个用空格包围的 or
或字符串结尾
我将问题分为两个级别。
- 第一级包括使用此正则表达式验证文本:
(?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))(?: or (?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))))+)
- 第二级包括使用
(({2}.+?){2})
捕获组(使用 java 中的匹配器)。
谢谢@Anubhava 先生的帮助。
使用两种模式:
- 组模式:
((\()|(|\) and|\) or|\))|([a-z ]+)))
- 第 1 组:打开你的深度
- 第 2 组:关闭你的深度
- 第 3 组:规格
- 规范模式:
((?: )(a|b|c) (and|or|))
- 第 1 组:句子
- 第 2 组:运算符
我很难让它发挥作用。我有一个像这样的字符串:
((a 和 b) 而不是 (c 和 d)) 或 ((e 和 f 和 h) 而不是 (c 和 d)) 或 ((h 和 i) 而不是 (k 和 d) ) ......
我需要的是匹配上面的字符串并捕获每两个括号((我的组))之间的文本,例如:
- 第 1 组:((a 和 b)而不是(c 和 d))
- 第 2 组:((e 和 f 和 h)而不是(c 和 d))
- 第 3 组:(c 和 d)) 或 ((h 和 i) 而不是 (k 和 d))
并用 'or' 运算符分隔。
这是我的正则表达式:
(\({2}.+?\){2})(?: (?:or) (\({2}.+?\){2}))+
当我单独使用时,我的正则表达式 (\({2}.+?\){2})
的第一部分匹配两个括号之间的所有组。但是当我添加第二部分以匹配由 'or' (?:or) (\({2}.+?\){2}))+
分隔的所有组时它不起作用 - 它似乎匹配下面的文本是不充分的:
((a and b) and not (c and d)) and ((a and b) and not (c and d))
.
感谢您的帮助
您可以在 Java:
中使用此正则表达式(?:^|(?!^)\G\h+or\h+)(\(\((?:(?!\)\)).)++\)\))(?=(?:\h+or\h+\(\((?:(?!\)\)).)++\)\))*$)
正则表达式详细信息:
(?:
: 启动一个非捕获组^
:匹配开始位置|
: 或\G\h+or\h+
:从上一场比赛结束开始,比赛or
被1+个空格包围
)
:结束非捕获组(
: 开始捕获组#1\(\(
: 比赛开始((
(?:(?!\)\)).)++
:匹配任何字符的 1+,只要它前面没有))
。++
是所有格量词\)\)
:比赛结束))
)
: 结束捕获组#1(?=\h+or\h+|$)
:先行断言我们有一个用空格包围的or
或字符串结尾
我将问题分为两个级别。
- 第一级包括使用此正则表达式验证文本:
(?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))(?: or (?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))))+)
- 第二级包括使用
(({2}.+?){2})
捕获组(使用 java 中的匹配器)。 谢谢@Anubhava 先生的帮助。
使用两种模式:
- 组模式:
((\()|(|\) and|\) or|\))|([a-z ]+)))
- 第 1 组:打开你的深度
- 第 2 组:关闭你的深度
- 第 3 组:规格
- 规范模式:
((?: )(a|b|c) (and|or|))
- 第 1 组:句子
- 第 2 组:运算符
- 规范模式: