开头括号中的正则表达式
regex in parenthesis at the beginning
我有一个正则表达式试图按专业划分问题。假设我有以下正则表达式:
(?P<speciality>[0-9x]+)
这题很好用(正确匹配:7)
(7)Which of the following is LEAST to be considered as a risk factor for esophageal cancer?;
为此(正确匹配:8 和 13)
(8,13)30 year old woman with amenorrhea, low serum estrogen and high serum LH/FSH, the most likely diagnosis is:
但不是这个(不正确的匹配:20)。
First trimester spontaneous abortion (before 20 wk) is most commonly due to:
我只需要问题开头括号中的数字,所有其他括号都应忽略。这是否可能仅使用正则表达式(先行?)。
如果您的正则表达式风格支持 \G
continuous matching and \K
reset beginning of match,请尝试:
(?:^\(|\G,)\K[\dx]+
^\(
将在开始时匹配括号 |
或 \G
匹配最后一个匹配后的 ,
。然后 \K
重置并匹配 +
一个或多个 [\dx]
。 (\d
是 shorthand 对应 [0-9]
)。比赛将在 [=24=]
.
Test at regex101.com; Regex FAQ
PHP 例子
$str = "(1x,2,3x) abc (1,2x,3) d";
preg_match_all('~(?:^\(|\G,)\K[\dx]+~', $str, $out);
print_r($out[0]);
Array
(
[0] => 1x
[1] => 2
[2] => 3x
)
也许这样的事情会起作用(你没有提到你正在使用的正则表达式风格,虽然我猜测它是使用命名组的 PCRE - 是的,它确实使用了正前瞻) :
^\((?P<speciality>(?:[0-9x]+,?)+)(?=\))/mg
插入符号 ^
与多行修饰符 \m
相结合(导致锚点 ^
和 $
分别匹配行的开头和结尾,而不是字符串的开头和结尾)将确保匹配的内容位于段落的开头。专业将在 specialty
命名的捕获组中捕获;唯一需要注意的是,如果给出了多个专业(如在您的示例中以 (8,13)
开头),则捕获将是一个以逗号分隔的列表,就像专业是一个以逗号分隔的列表一样(使用相同的示例, 在这种情况下捕获将是 8,13
).
(?P<speciality>[0-9x]+)
匹配输入中任意位置的任何非空数字序列。括号只是分隔捕获组,但不是匹配项的一部分。
要匹配行首括号之间的数字(或更多由逗号分隔),您可以使用类似这样的东西
^\((\d+)(,(\d+))*\)
编辑
似乎重复捕获组,因为 in (,(\d+))*
,只会 return 最后匹配。所以要获得值,有必要捕获完整的数字列表并在之后解析它:
^\((?P<specialities>(\d+)(,(\d+))*)\)
将捕获一个或多个用逗号分隔的数字,在括号之间。
添加了行锚点的开头,因此它位于行的开头。
我有一个正则表达式试图按专业划分问题。假设我有以下正则表达式:
(?P<speciality>[0-9x]+)
这题很好用(正确匹配:7)
(7)Which of the following is LEAST to be considered as a risk factor for esophageal cancer?;
为此(正确匹配:8 和 13)
(8,13)30 year old woman with amenorrhea, low serum estrogen and high serum LH/FSH, the most likely diagnosis is:
但不是这个(不正确的匹配:20)。
First trimester spontaneous abortion (before 20 wk) is most commonly due to:
我只需要问题开头括号中的数字,所有其他括号都应忽略。这是否可能仅使用正则表达式(先行?)。
如果您的正则表达式风格支持 \G
continuous matching and \K
reset beginning of match,请尝试:
(?:^\(|\G,)\K[\dx]+
^\(
将在开始时匹配括号 |
或 \G
匹配最后一个匹配后的 ,
。然后 \K
重置并匹配 +
一个或多个 [\dx]
。 (\d
是 shorthand 对应 [0-9]
)。比赛将在 [=24=]
.
Test at regex101.com; Regex FAQ
PHP 例子
$str = "(1x,2,3x) abc (1,2x,3) d";
preg_match_all('~(?:^\(|\G,)\K[\dx]+~', $str, $out);
print_r($out[0]);
Array
(
[0] => 1x
[1] => 2
[2] => 3x
)
也许这样的事情会起作用(你没有提到你正在使用的正则表达式风格,虽然我猜测它是使用命名组的 PCRE - 是的,它确实使用了正前瞻) :
^\((?P<speciality>(?:[0-9x]+,?)+)(?=\))/mg
插入符号 ^
与多行修饰符 \m
相结合(导致锚点 ^
和 $
分别匹配行的开头和结尾,而不是字符串的开头和结尾)将确保匹配的内容位于段落的开头。专业将在 specialty
命名的捕获组中捕获;唯一需要注意的是,如果给出了多个专业(如在您的示例中以 (8,13)
开头),则捕获将是一个以逗号分隔的列表,就像专业是一个以逗号分隔的列表一样(使用相同的示例, 在这种情况下捕获将是 8,13
).
(?P<speciality>[0-9x]+)
匹配输入中任意位置的任何非空数字序列。括号只是分隔捕获组,但不是匹配项的一部分。
要匹配行首括号之间的数字(或更多由逗号分隔),您可以使用类似这样的东西
^\((\d+)(,(\d+))*\)
编辑
似乎重复捕获组,因为 in (,(\d+))*
,只会 return 最后匹配。所以要获得值,有必要捕获完整的数字列表并在之后解析它:
^\((?P<specialities>(\d+)(,(\d+))*)\)
将捕获一个或多个用逗号分隔的数字,在括号之间。
添加了行锚点的开头,因此它位于行的开头。