开头括号中的正则表达式

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]。 (\dshorthand 对应 [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
)

Test at eval.in

也许这样的事情会起作用(你没有提到你正在使用的正则表达式风格,虽然我猜测它是使用命名组的 PCRE - 是的,它确实使用了正前瞻) :

^\((?P<speciality>(?:[0-9x]+,?)+)(?=\))/mg

插入符号 ^ 与多行修饰符 \m 相结合(导致锚点 ^$ 分别匹配行的开头和结尾,而不是字符串的开头和结尾)将确保匹配的内容位于段落的开头。专业将在 specialty 命名的捕获组中捕获;唯一需要注意的是,如果给出了多个专业(如在您的示例中以 (8,13) 开头),则捕获将是一个以逗号分隔的列表,就像专业是一个以逗号分隔的列表一样(使用相同的示例, 在这种情况下捕获将是 8,13).

see Regex Demo here.

(?P<speciality>[0-9x]+) 匹配输入中任意位置的任何非空数字序列。括号只是分隔捕获组,但不是匹配项的一部分。

要匹配行首括号之间的数字(或更多由逗号分隔),您可以使用类似这样的东西

^\((\d+)(,(\d+))*\)

编辑

似乎重复捕获组,因为 in (,(\d+))*,只会 return 最后匹配。所以要获得值,有必要捕获完整的数字列表并在之后解析它:

^\((?P<specialities>(\d+)(,(\d+))*)\)

将捕获一个或多个用逗号分隔的数字,在括号之间。

添加了行锚点的开头,因此它位于行的开头。

Demo