perl - 用两个不同的定界符将一条线分成几部分

标签 perl

我有以下结构的行:

STRING1 space STRING2 space FREETEXT

STRING1STRING2 都可以是:

  1. "space* slash space*"\s*/\s* 分隔的单词,例如word1/word2/word3.
  2. 一个单字。正则表达式:\w+
  3. FREETEXT 是任何字符串... (.*)

我知道如何匹配:

* one word such `\w+`
* two delimited words: `\w+\s*/\s*\w+'

但不知道如何匹配由 \s*/\s* 分隔的“1 更多”单词,例如像 /(\w+(\s*/\s*)?)/

这样的东西

也许更容易理解的定义:

line: string space string space freetext;
string: \w+
        ||
        string \s*/\s* \w+
space: \s+
freetext: .*

需要获取所有 3 个部分,例如以下代码

use 5.014;
use warnings;
my $slash_string = qr(\w+|\w+\s*/\s*);                     #<- help1 here
while(<DATA>) {
    if( m{^($slash_string)+\s+($slash_string)+\s+(.*)$} ) {  #<- help2 here
        say join ' | ', $1, $2, $3;
    }
}
__DATA__
magnam est dolorem ea est
non / ipsum harum asperiores nesciunt voluptatem
nunt / harum / dicta nisi minus quo similique unde
porro inventore / repudiandae dolorem ipsum
enim  ipsam / aut / numquam illum vero eveniet
natus / voluptas aut / deserunt et nisi sequi est
sed / quam / magni ex / assumenda / et eaque cum et modi

应该产生想要的输出

magnam | est | dolorem ea est
non / ipsum | harum | asperiores nesciunt voluptatem
nunt / harum / dicta | nisi | minus quo similique unde
porro | inventore / repudiandae | dolorem ipsum
enim | ipsam / aut / numquam | illum vero eveniet
natus / voluptas | aut / deserunt | et nisi sequi est
sed / quam / magni | ex / assumenda / et | eaque cum et modi

最佳答案

这将按照您的要求进行。我已将 $slash_string 更改为一个单词,后跟零次或多次出现的斜线,然后是另一个单词。

我还从你的 ($slash_string)+ 中去掉了 + 量词(因为我们在这里只需要一个斜线分隔的单词序列)并添加了 /x 修饰符,以便通过添加无关紧要的空格使模式更具可读性。

我很确定输出符合您的要求,但我只是用眼睛检查过。

use 5.014;
use warnings;

my $slash_string = qr/ \w+ (?: \s* \/ \s* \w+ )* /x;

while ( <DATA> ) { 
    if ( / ^ ($slash_string) \s+ ($slash_string) \s+ (.*) /x ) {
        say join '  ', map "[$_]", $1, $2, $3;
    }
}

__DATA__
magnam est dolorem ea est
non / ipsum harum asperiores nesciunt voluptatem
nunt / harum / dicta nisi minus quo similique unde
porro inventore / repudiandae dolorem ipsum
enim ipsam / aut / numquam illum vero eveniet
natus / voluptas aut / deserunt et nisi sequi est
sed / quam / magni ex / assumenda / et eaque cum et modi

输出

[magnam]  [est]  [dolorem ea est]
[non / ipsum]  [harum]  [asperiores nesciunt voluptatem]
[nunt / harum / dicta]  [nisi]  [minus quo similique unde]
[porro]  [inventore / repudiandae]  [dolorem ipsum]
[enim]  [ipsam / aut / numquam]  [illum vero eveniet]
[natus / voluptas]  [aut / deserunt]  [et nisi sequi est]
[sed / quam / magni]  [ex / assumenda / et]  [eaque cum et modi]

关于perl - 用两个不同的定界符将一条线分成几部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30041069/

相关文章:

perl - 在简单的 Perl 教程中为模块添加包含路径

perl - 如何使用 mod_perl2 正确 fork ?

perl - "$|++"和 "$|=1"有什么区别

xml - 使用 Perl XML::DOM 模块的解析器错误, "reference to invalid character number"

Perl SQLite DBI SELECT 绑定(bind)不起作用

perl - 如何使用 Perl 6 运行外部程序? (例如 Perl 5 中的 "system")

python - Windows Phone 是否支持脚本?

linux - 如何让 Perl 遍历目录中的所有文件?

c++ - 在 perl 中调试由 SWIG 包装的共享库

javascript - 此处文档中的 JQuery 不起作用