我有一个与正则表达式相关的问题。我的元素为$str1 = <strong>average_speed_answer_good_high</strong>
我想要做的是在一个变量的变量"_good_high"
和变量"average_speed_answer"
中$sub_str1
(在本例中为"good_high"
)之前获取字符串{ {1}}。
此处$sub_str2
是字符串中唯一的常量部分,其余部分可以更改。即使在"_good_high"
之后,"_good_high"
之前也可能会有一些字符。我可以获得一些关于如何做到这一点的提示吗?
到现在为止,我能够做到这样的事情:
"</strong>"
我尝试了一些像
这样的组合if ( $str1 =~ m{(<strong>)(.*?)(</strong>)} ) {
$sub_str1 = $2; #which gives average_speed_answer_good_high
}
但他们都在(<strong>)(?=_good_high)(</strong>)
(<strong>)(?<=_good_high)(</strong>)
(<strong>)((?<=_good_high)\w+)(</strong>) #tried $2 and $3
(<strong>)(?<=_good_high)\w+(</strong>)
(<strong>)((?<=(_good_high))\w+)(</strong>)#tried $2, $3 and $4
中填空。
我将不胜感激任何帮助或提示。
答案 0 :(得分:1)
您需要在结束强标记之前指定_good_high
。
if ( $str1 =~ m{(<strong>)(.*?)_good_high.*?(</strong>)} ) {
$sub_str1 = $2;
}
或
if ( $str1 =~ m{<strong>(.*?)_good_high.*?</strong>} ) {
$sub_str1 = $1;
}
答案 1 :(得分:1)
怎么样:
@objc class StringFormat: NSObject {
class func format(key: String, args: [AnyObject]) -> String {
let locArgs: [CVarArgType] = args.map({ (arg: AnyObject) -> CVarArgType in
if let iArg = (arg is NSNumber ? arg.intValue : nil) {
return iArg
}
return arg as! CVarArgType
});
return String(format: key, arguments: locArgs)
}
}
答案 2 :(得分:1)
不要太依赖正则表达式和捕获组。它们并不是您框中唯一的工具。
例如:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $str1 = '<strong>average_speed_answer_good_high</strong>';
if ( my ($sub_str1) = $str1 =~ m{<strong>(.*?)</strong>} ) {
print "Substr: $sub_str1\n";
my @split_str = split ( /_/, $sub_str1 );
print Dumper \@split_str;
print "Extracted: ",join ( "_", (split ( /_/, $sub_str1 ))[0..2] ),"\n";
}
我们像以前一样提取子字符串 - 但随后我们使用_
:
$VAR1 = [
'average',
'speed',
'answer',
'good',
'high'
];
然后再将它们粘在一起,将元素0
保存到2
以获得答案。
答案 3 :(得分:0)
您的问题似乎是由于您了解(
,)
,?
,.*
和.*
的运作情况而导致的。
在你的第二部分示例中,没有变量部分,只有分组,有时没有捕获。
pre(.*)post
导致pre
post
和$1
之间的捕获
pre(?:a|b|c)post
会导致分组替代方案而不会捕获a(.*?)b
导致非贪婪匹配(+捕获):匹配 x
而非 xby
axbyb
答案 4 :(得分:0)
我认为最好的方法如下。只需查找除<strong>
标记前面的尖括号以外的所有文字(不需要搜索结束标记),然后查看_good_high
。那是想要的子串
use strict;
use warnings;
my $s = <<END;
<html>
<body>
<strong>average_speed_answer_good_high</strong>
</body>
</html>
END
if ( my ($text) = $s =~ /<strong>([^<>]+)_good_high/ ) {
print $text, "\n";
}
average_speed_answer