正则表达式获取两个管道之间的内容并返回一个空间,其中两个管道彼此相邻,没有空格

时间:2011-06-01 15:57:54

标签: ruby regex

如何获取管道之间的所有内容并返回一个空格,在这个空间中,两个管道彼此相邻?

示例字符串和所需的输出是:

|test1| test2|test3 || test 4 |

Result1: "test1"
Result2: "test2"
Result3: "test3"
Result4: " "
Result5: "test4"

我到目前为止最接近的是:

  • /[^\|]+)/将获取管道之间的所有数据,但不会检测到||
  • /\|([^\|]*)/将获取管道之间的所有数据并检测||,但最后会产生额外的空白结果。

5 个答案:

答案 0 :(得分:1)

单独使用正则表达式是不可能的 - 正则表达式只能返回它们匹配的文本,而不能创建新文本。

因此,您必须以编程方式检测是否存在空匹配并将结果更改为单个空格。你用的是哪种语言?

例如,在C#中你可以这样做:

Regex regexObj = new Regex(@"(?<=\|\s*).*?(?=\s*\|)", RegexOptions.Multiline);
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
    text = matchResults.Value
    if (text == "") {
        text = " "
    }
    // now do whatever you want with it
    matchResults = matchResults.NextMatch();
} 

在Ruby中,在版本1.8之前你没有lookbehind,所以你需要一个不同的方法。首先删除前导和尾随分隔符:

temp = subject.gsub(/^\s*\|\s*|\s*\|\s*$/, '')

然后沿着剩余的分隔符分开:

result = temp.split(/\s*\|\s*/)

然后迭代你得到的数组,用空格替换空字符串。

答案 1 :(得分:0)

您可以使用\s*\|\s*拆分字符串,并获取包含每个部分的数组。在不知道您使用的是哪种语言的情况下,我不能说具体的API会对字符串上的正则表达式进行拆分。

答案 2 :(得分:0)

正如蒂姆已经提到的,只使用正则表达式是不可能的。

一种方法是:

  1. 移除前导管和尾随管。
  2. 在空格上分割字符串,然后是管道,后跟空格。
  3. 如果您发现任何作品为空,请将其设为" "
  4. Perl:

    $str = '|test1| test2|test3 || test 4 |';
    $str =~s/^\||\|$//;
    @pieces = split/\s*\|\s*/,$str;
    foreach(@pieces) {
            $_ = ' ' if($_ eq '');                                                  
            print $_,"\n";
    }
    

答案 3 :(得分:0)

(?<=\|)([^\|]*)(?=|)应该做你想做的事。它使用正面和负面lookarounds,因此不会消耗管道用于其他匹配。

这会为您提供结果:"test1"" test2""test3 """" test 4 "

如果您想使用正则表达式修剪结果,请使用(?<=\|)\s*([^\|]*)\s*(?=|),为您提供"test1""test2""test3"""和{{1 }}

测试4更难,因为你无法移除内部空间。并且,如前所述,正则表达式无法创建文本,因此无法在测试3和4之间返回"test 4"。当然,您可以使用您正在使用的任何其他语言测试空字符串并在以后替换它们。

答案 4 :(得分:0)

在Ruby中,我不打扰正则表达式:

str = '|test1| test2|test3 || test 4 |'
str.split('|')[1 .. -1].map{ |s| (s.strip.empty?) ? ' ': s.strip } #=> ["test1", "test2", "test3", " ", "test 4"]