regex 如何使用正则表达式获取连字符单词的第二部分?

qrjkbowd  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(159)

例如,我有这样一句话:sh0rt-t3rm .如何使用perl正则表达式获取t3rm部分?
我可以通过使用[(a-zA-Z0-9)+]\[-\]得到sh0rt,但是\[-\][(a-zA-Z0-9)+]不能得到t3rm

66bbxpm5

66bbxpm51#

正则表达式使用的语法不正确,无法获取sh0rtt3rm
您翻转了方括号和圆括号,连字符不必位于方括号之间。
要在sh0rt-t3rm中获取sh0rt,您可以使用以下示例之一:
| 正则表达式|演示|说明|
| - -|- -|- -|
|

\b([a-zA-Z0-9]+)-

|Demo 1|\b是防止部分字匹配的字边界,该值在捕获组1中。|
|

\b[a-zA-Z0-9]+(?=-)

|Demo 2|匹配字符类中允许的字符,并使用正lookahead (?=-)在右侧Assert-|
要在sh0rt-t3rm中获取t3rm,可以使用以下示例之一:
| 正则表达式|演示|说明|
| - -|- -|- -|
|

-([a-zA-Z0-9]+)\b

|Demo 3|以-为前导,从捕获组1获取该值。|
|

-\K[a-zA-Z0-9]+\b

|Demo 4|匹配-并使用\K来排除目前匹配的字符。然后匹配字符类中允许的字符一次或多次。|

rlcwz9us

rlcwz9us2#

如果整个目标字符串实际上就是sh0rt-t3rm,那么您需要-之后的所有字符串。
因此,最简单和最小的版本,削减正是为了这个描述,是

my ($capture) = $string =~ /-(.+)/;

我们需要在左边加上括号,这样正则表达式才能在列表上下文中运行,因为这是它返回匹配的时候(否则它会返回true/false,通常是1'')。
但是,如果前面的文本本身可能有-呢?然后确保匹配 all 直到最后一个-

my ($capture) = $string =~ /.*-(.+)/;

这里,*量词的“贪婪”性质使得先前的.尽可能地匹配,使得整个模式仍然匹配;因此它上升直到最后的-
当然,除了一个带连字符的单词之外,数据的外观还有许多其他变化。

my ($capture) = $string =~ /\b.*?-(.+?)\b/;

这里我们还需要调整类似“通配符”的模式.+,使用?来限制它,这样它就不会太贪婪。这匹配$string中第一个这样的连字符。但是如果确实只有“word”字符飞行,那么我们就可以使用\w(而不是.和单词边界锚)

my ($capture) = $string =~ /\w*?-(\w+)/;

请注意,\w仅匹配[a-zA-Z0-9_],这排除了一些可能出现在正常文本(英语,更不用说所有其他书写系统)中的字符。
但这显然是越来越挑剔和饼干,将需要仔细仔细检查和测试,并更完整的知识,什么数据可能看起来像。
Perl提供了自己的教程perlretut,主要的完整参考是perlre

azpvetkf

azpvetkf3#

-([a-zA-Z0-9]+)将匹配后跟一个单词的-,并且只捕获该单词。
Demo

相关问题