【问题标题】:Match part of string enclosed by delimiters using regex使用正则表达式匹配由分隔符包围的部分字符串
【发布时间】:2011-09-05 16:05:49
【问题描述】:

我正在尝试将字符串的一部分与分隔符匹配。我想检索的字符串是货币符号。

字符串看起来像:

0.040-aa-¥-bb-234,5.4
234,5.4-aa-CN¥-bb-blahblahb
-aa-$-bb-sdfsefblah3949
34blah-aa-$-bb-
and so on.

这应该被提取到:

¥
CN¥
$
$

所以本质上,我将有一个由任意数量的字符组成的字符串,带有货币符号。货币符号将始终在前面有 -aa-,在后面有 -bb-。我想检索这两个分隔符之间的内容。

目前,我想出了这个表达式:-aa-[^\]]+-bb-,但是,它包括 -aa- 和 -bb-。如何排除这些部分?

干杯:)

【问题讨论】:

    标签: php regex


    【解决方案1】:
    preg_match('/(?<=-aa-)[^-]*(?=-bb-)/', $string, $matches)
    

    为您提供货币符号作为整个匹配结果。

    (?&lt;=...)(?=...)lookaround assertions,这意味着它们会检查当前位置之前或之后是否存在封闭的正则表达式,而不会使它们成为整体匹配的一部分。

    【讨论】:

    • 值得注意的是,这只是因为分隔符是固定长度的。 PHP 不支持后向断言中的无限重复(例如,.NET 支持),但在您的情况下这不是问题。
    【解决方案2】:

    要检索表达式的特定部分,请使用捕获组,例如

    if (preg_match('/-aa-(.+?)-bb-/', $string, $matches) == 1) {
        $symbol = $matches[1];
    }
    

    【讨论】:

    • 是否可以在没有子模式的情况下执行此操作,然后通过 $matches[0] 访问它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2013-08-11
    • 2010-09-15
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多