Regex 我能';找不到合适的正则表达式
我有以下文件(与此方案类似,但要长得多): 每行中有两个单词(如Regex 我能';找不到合适的正则表达式,regex,perl,Regex,Perl,我有以下文件(与此方案类似,但要长得多): 每行中有两个单词(如LSE ZTX),开头、结尾和中间都有空格和/或制表符。 有人能帮我把这两个单词和regexp匹配起来吗?下面的例子中,我希望第一行的LSE为1美元,ZTX为2美元,第二行的SWX为1美元,ZURN为2美元,等等。 我试过这样的方法: $line =~ /(\t|\s)*?(.*?)(\t|\s)*?(.*?)/msgi; $line =~ /[\t*\s*]?(.*?)[\t*\s*]?(.*?)/msgi; 我不知道怎么说,可
LSE ZTX
),开头、结尾和中间都有空格和/或制表符。
有人能帮我把这两个单词和regexp匹配起来吗?下面的例子中,我希望第一行的LSE为1美元,ZTX为2美元,第二行的SWX为1美元,ZURN为2美元,等等。
我试过这样的方法:
$line =~ /(\t|\s)*?(.*?)(\t|\s)*?(.*?)/msgi;
$line =~ /[\t*\s*]?(.*?)[\t*\s*]?(.*?)/msgi;
我不知道怎么说,可能有空格或制表符(或者两者混合,因此对于ex.\t\s\t)假设行首的空格是您用来标识所需代码的,请尝试以下操作: 在换行符处拆分字符串,然后尝试以下正则表达式:
^\s+(\w+\s+){2}$
这将只匹配以一些空格开头,后跟(单词-一些空格-单词),然后以一些空格结尾的行
# ^ --> String start
# \s+ --> Any number of spaces
# (\w+\s+){2} --> A (word followed by some space)x2
# $ --> String end.
但是如果要单独捕获代码,请执行以下操作:
这将匹配您的所有代码
/[A-Z]+/
\s
还包括制表,因此您的正则表达式如下所示:
$line =~ /^\s*([A-Z]+)\s+([A-Z]+)/;
第一个单词在第一组中($1),第二个单词在$2中
您可以根据需要将[A-Z]
更改为更方便的选项
这是我的解释
始终是两个字,您不需要匹配整行,因此最简单的正则表达式是:
/(\w+)\s+(\w+)/
我想这就是你想要的
^\s*([A-Z]+)\s+([A-Z]+)
看到它,您可以在组1中找到行的第一个代码,在组2中找到第二个代码\s
是一个空白字符,包括空格、制表符和换行符等
在Perl中是这样的:
($code1, $code2) = $line =~ /^\s*([A-Z]+)\s+([A-Z]+)/i;
我认为您正在逐行读取文本文件,因此不需要修饰符s
和m
,也不需要g
如果代码不仅仅是ASCII字母,则将[A-Z]
替换为\p{L}
\p{L}
是一个将匹配每种语言中每个字母的正则表达式。此正则表达式带有选项“Multiline”:
^\s*(?<word1>\S+)\s+(?<word2>\S+)\s*$
^\s*(?\s+)\s+(?\s+)\s*$
将为您提供N个匹配项,每个匹配项包含2个组,名为:
-字1
-word2^\s*([A-Z]{3,4})\s+([A-Z]{3,4})$
这是干什么的
^ // Matches the beginning of a string
\s* // Matches a space/tab character zero or more times
([A-Z]{3,4}) // Matches any letter A-Z either 3 or 4 times and captures to $1
\s+ // Then matches at least one tab or space
([A-Z]{3,4}) // Matches any letter A-Z either 3 or 4 times and captures to $2
$ // Matches the end of a string
如果只想匹配前两个单词,最基本的是只匹配任何非空白字符序列:
my ($word1, $word2) = $line =~ /\S+/g;
这将把
$line
中的前两个单词捕获到变量中(如果存在)。请注意,使用/g
修饰符时不需要括号。如果要捕获所有现有匹配项,请改用数组。您可以在此处使用拆分:
use strict;
use warnings;
while (<DATA>) {
my ( $word1, $word2 ) = split;
print "($word1, $word2)\n";
}
__DATA__
LSE ZTX
SWX ZURN
LSE ZYT
NYSE CGI
这将与没有空格的行不匹配。行首的空格被解释为可选。@ZackT:我假设行首的空格是用户想要获得的字符串的标识。这是识别这些空间的唯一方法,用户似乎希望找到可能包含这些空间的代码。除非问题得到澄清,否则这实际上就是问题的答案。没有理由否决投票。我认为他不想只捕获带有空格的代码,我认为他是说任何一行在实际代码之前都可能有空格或制表符,然后是更多的空格或制表符,然后是另一个代码,他想得到所有的代码。@ZackT.:有两个代码带有可选的空格和/或制表符。有人能帮我用regexp计算这两个代码吗?
读这个该死的问题。“计算这两个代码”到底是什么意思?这个问题的格式不是很好。听起来你只需要split',$line
^ // Matches the beginning of a string
\s* // Matches a space/tab character zero or more times
([A-Z]{3,4}) // Matches any letter A-Z either 3 or 4 times and captures to $1
\s+ // Then matches at least one tab or space
([A-Z]{3,4}) // Matches any letter A-Z either 3 or 4 times and captures to $2
$ // Matches the end of a string
my ($word1, $word2) = $line =~ /\S+/g;
use strict;
use warnings;
while (<DATA>) {
my ( $word1, $word2 ) = split;
print "($word1, $word2)\n";
}
__DATA__
LSE ZTX
SWX ZURN
LSE ZYT
NYSE CGI
(LSE, ZTX)
(SWX, ZURN)
(LSE, ZYT)
(NYSE, CGI)