我想提取最后两个"-"之间的字符串(T恤也有"-",这会破坏我的结果。
例如:
T-shirt Layla gaga-papa-lk
所以我想回"爸爸"。我试着使用(?<=-)[^-)]+(?=-)
,但由于t恤的原因,它在这个例子中不起作用。
在这个例子中,它确实有效:
Gh world papa -mama-p
您可以将模式更新为:
(?<=-)[^-n]+(?=-[^-n]*$)
模式匹配:
(?<=-)
向左断言-
[^-n]+
匹配除-
或换行符之外的任何字符的1+次出现(?=-[^-n]*$)
向右断言一个-
,后跟除-
之外的任何字符或换行符,直到字符串结束
Regex演示
或者使用捕获组而不是环视:
-([^-n]+)-[^-n]*$
Regex演示
取反字符类中的n
与交叉换行符不匹配。
示例数据中没有)
,但如果您也不想匹配,可以将其添加到否定字符类[^-n)]+
中
您可以匹配以下正则表达式:
(?=[^n-]*-[^n-]*$)[^n-]*
启动发动机!
(?=[^n-]*-[^n-]*$)
是一个正向前瞻,当正则表达式引擎将其内部字符串指针从字符串的开头移动到刚好经过倒数第二个连字符时,它就满足了。如果字符串是"a-b-c-d-e"
,则当指针位于第三个连字符和字母"d"
之间时,前瞻性将得到满足。因此,所需的字符串由该位置和下一个(最后一个(连字符之间的字符组成。
正则表达式可以分解如下。
(?= # begin positive lookahead
[^n-]* # match zero or more characters other than a newline or hyphen
- # match a hyphen
[^n-]* # match zero or more characters other than a newline or hyphen
$ # match end of string
) # end positive lookahead
[^n-]* # match zero or more characters other than a newline or hyphen
请注意此表达式中的重复,其中[^n-]*
出现了三次。如果正则表达式引擎支持子例程(或子表达式(,则表达式可以简化如下(我使用PCRE引擎语法进行了说明(:
(?=([^n-]*)-(?1)$)(?1)
编号组子程序演示
或
(?=(?P<non_hyphens>[^n-]*)-(?P>non_hyphens)$)(?P>non_hyphens)
命名组子程序演示
子例程,尤其是带有命名组的子例程,使正则表达式更加紧凑、易于遵循,并减少了不小心的编码错误。