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)