2012-02-05 81 views
2

这是一些学术问题,我只是想知道是否有可能捕获一个组(使用PHP preg_match()函数的f.e.),并在结果中排​​除了子字符串。我有兴趣在正则表达式上实现这一点。让我解释一下,我在说什么。PRCE:在捕获组结果中子字符串排除

铁,我有源字符串,如:

... 
... needed_NUMERIC_substr_1 not_needed_ALPHA_substr need_NUMERIC_substr2 ... 
... 

是否可以写正则表达式将返回:

Array 
(
    [0] => %**NOT_IMPORTANT_THAT_WILL_BE_HERE**% 
    [1] => needed_NUMERIC_substr_1 need_NUMERIC_substr2 
) 

我明白了,这是可以分别匹配都需要串使用不同的捕获组,然后在代码中执行任何所需的操作。这只是学术兴趣。

我想过使用条件子模式先行回顾后零宽度断言,但无法找到解决方案。如果有可能,如何实现?

+2

我怀疑它......因为你的捕获组匹配了整个文本,所以这样工作是不合逻辑的。它是'match',而不是'match_and_postprocess'。) – Vyktor 2012-02-05 22:25:36

+0

Thx @Vyktor,同意这是不合逻辑和太复杂的方式。但我仍然想知道:)。 – Milkywayfarer 2012-02-05 22:30:47

+0

@Shiplu,这不是本地作业。这是我自己的学术兴趣。 – Milkywayfarer 2012-02-05 22:31:27

回答

1

不,这是不可能的。

preg_match不提供任何选项如何将匹配的组连接在一起或擦除(用空字符串替换)匹配文本的一部分。

+0

正则表达式级别如何?它完全不可解决吗? – Milkywayfarer 2012-02-05 22:33:18

+0

@Milkywayfarer对不起,我不明白这个问题。 – Vyktor 2012-02-05 22:35:02

+0

我的意思是,如果可以在正则表达式中添加一些逻辑?我知道有条件的子范畴。也许可以用它们或其他先进的正则表达式来实现。 – Milkywayfarer 2012-02-05 22:38:53

1

由于问题似乎是如何从输入字符串123abc456得到123456,我不会使用preg_match。相反,我会使用preg_replace并用空字符串替换不是数字的所有内容,以便它们被有效地删除。

$string = '123abc456'; 
$result = preg_replace('/[^0-9]/', '', $string); 
echo $result; // prints 123456 
+0

Thx为您的答复,但问题是关于如何在正则表达式级别上做到这一点。如果原则上...... – Milkywayfarer 2012-02-05 22:56:55

+0

@Milkywayfarer,实际上,'preg_replace'使用正则表达式。看到我更新的答案。 – Arjan 2012-02-05 23:04:10

+0

thx我看到了,并且清楚地理解了这种方法,并且这是通常的方法并且是正确的实际解决方案。但我的兴趣是非实践性的,这是学术性的。我想澄清一下,只有用正则表达式才能解决这个问题。 F.E.编写这样的正则表达式,它将匹配“123abc456”,并在其中一个捕获组中返回“123456”。 – Milkywayfarer 2012-02-05 23:11:15

1

不可能。捕获组捕获只会继续输入字符串的子字符串(或者根本没有)。

+0

Thx。似乎真的不可能得票现在是:4:0。 – Milkywayfarer 2012-02-06 01:31:19