例如,我有这样一句话:sh0rt-t3rm .如何使用perl正则表达式获取t3rm部分?我可以通过使用[(a-zA-Z0-9)+]\[-\]得到sh0rt,但是\[-\][(a-zA-Z0-9)+]不能得到t3rm。
sh0rt-t3rm
t3rm
[(a-zA-Z0-9)+]\[-\]
sh0rt
\[-\][(a-zA-Z0-9)+]
66bbxpm51#
正则表达式使用的语法不正确,无法获取sh0rt或t3rm您翻转了方括号和圆括号,连字符不必位于方括号之间。要在sh0rt-t3rm中获取sh0rt,您可以使用以下示例之一:| 正则表达式|演示|说明|| - -|- -|- -||
\b([a-zA-Z0-9]+)-
|Demo 1|\b是防止部分字匹配的字边界,该值在捕获组1中。||
\b
\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来排除目前匹配的字符。然后匹配字符类中允许的字符一次或多次。|
\K
rlcwz9us2#
如果整个目标字符串实际上就是sh0rt-t3rm,那么您需要-之后的所有字符串。因此,最简单和最小的版本,削减正是为了这个描述,是
my ($capture) = $string =~ /-(.+)/;
我们需要在左边加上括号,这样正则表达式才能在列表上下文中运行,因为这是它返回匹配的时候(否则它会返回true/false,通常是1或'')。但是,如果前面的文本本身可能有-呢?然后确保匹配 all 直到最后一个-
1
''
my ($capture) = $string =~ /.*-(.+)/;
这里,*量词的“贪婪”性质使得先前的.尽可能地匹配,使得整个模式仍然匹配;因此它上升直到最后的-。当然,除了一个带连字符的单词之外,数据的外观还有许多其他变化。
*
.
my ($capture) = $string =~ /\b.*?-(.+?)\b/;
这里我们还需要调整类似“通配符”的模式.+,使用?来限制它,这样它就不会太贪婪。这匹配$string中第一个这样的连字符。但是如果确实只有“word”字符飞行,那么我们就可以使用\w(而不是.和单词边界锚)
.+
?
$string
\w
my ($capture) = $string =~ /\w*?-(\w+)/;
请注意,\w仅匹配[a-zA-Z0-9_],这排除了一些可能出现在正常文本(英语,更不用说所有其他书写系统)中的字符。但这显然是越来越挑剔和饼干,将需要仔细仔细检查和测试,并更完整的知识,什么数据可能看起来像。Perl提供了自己的教程perlretut,主要的完整参考是perlre
[a-zA-Z0-9_]
azpvetkf3#
-([a-zA-Z0-9]+)将匹配后跟一个单词的-,并且只捕获该单词。Demo
-([a-zA-Z0-9]+)
3条答案
按热度按时间66bbxpm51#
正则表达式使用的语法不正确,无法获取
sh0rt
或t3rm
您翻转了方括号和圆括号,连字符不必位于方括号之间。
要在
sh0rt-t3rm
中获取sh0rt
,您可以使用以下示例之一:| 正则表达式|演示|说明|
| - -|- -|- -|
|
|Demo 1|
\b
是防止部分字匹配的字边界,该值在捕获组1中。||
|Demo 2|匹配字符类中允许的字符,并使用正lookahead
(?=-)
在右侧Assert-
|要在
sh0rt-t3rm
中获取t3rm
,可以使用以下示例之一:| 正则表达式|演示|说明|
| - -|- -|- -|
|
|Demo 3|以
-
为前导,从捕获组1获取该值。||
|Demo 4|匹配
-
并使用\K
来排除目前匹配的字符。然后匹配字符类中允许的字符一次或多次。|rlcwz9us2#
如果整个目标字符串实际上就是
sh0rt-t3rm
,那么您需要-
之后的所有字符串。因此,最简单和最小的版本,削减正是为了这个描述,是
我们需要在左边加上括号,这样正则表达式才能在列表上下文中运行,因为这是它返回匹配的时候(否则它会返回true/false,通常是
1
或''
)。但是,如果前面的文本本身可能有
-
呢?然后确保匹配 all 直到最后一个-
这里,
*
量词的“贪婪”性质使得先前的.
尽可能地匹配,使得整个模式仍然匹配;因此它上升直到最后的-
。当然,除了一个带连字符的单词之外,数据的外观还有许多其他变化。
这里我们还需要调整类似“通配符”的模式
.+
,使用?
来限制它,这样它就不会太贪婪。这匹配$string
中第一个这样的连字符。但是如果确实只有“word”字符飞行,那么我们就可以使用\w
(而不是.
和单词边界锚)请注意,
\w
仅匹配[a-zA-Z0-9_]
,这排除了一些可能出现在正常文本(英语,更不用说所有其他书写系统)中的字符。但这显然是越来越挑剔和饼干,将需要仔细仔细检查和测试,并更完整的知识,什么数据可能看起来像。
Perl提供了自己的教程perlretut,主要的完整参考是perlre
azpvetkf3#
-([a-zA-Z0-9]+)
将匹配后跟一个单词的-
,并且只捕获该单词。Demo