在正则表达式中只接受一行中的单个字符

时间:2011-04-04 22:32:15

标签: java regex

我正在尝试在Bananas|,|Bananas|||Bananas|Oranges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Green Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Pears|||分隔符上将带有正则表达式的|,|格式的字符串拆分。我正在使用[a-zA-Z |]+\|[,|\0]\|,但我遇到一个小问题:[a-zA-Z |]字符类捕获了三管分隔符。

有没有办法将[a-zA-Z |]字符类更改为只接受一行中的一个管道字符,同时允许任意数量的其他管道字符? (即,它应该接受accessories|batteries但不接受accessories||batteries。)

更多示例:在原始字符串中,正则表达式应接受Bananas|Oranges|,|Bananas|||,而不是Bananas|||Bananas|Oranges|,|,在{{1}之前使用任意数量的单管道分隔名称}。

4 个答案:

答案 0 :(得分:1)

我认为您希望包含大量这些[a-zA-Z ]+的群组后跟\|。该群组可以重复多次,并始终由,|||终止(在追踪|之后)(,|\|)\|

总而言之:([a-zA-Z ]+\|)+(,|\|)\|

答案 1 :(得分:0)

由于您说您正在使用Java,因此另一种方法是计算:

s.replaceAll("|||", "|,|").split("|,|");

其中s是你的起始字符串。

答案 2 :(得分:0)

为什么不在正则表达式上使用非贪婪的量词?这样它就会停在它找到的第一个||||,|

答案 3 :(得分:0)

我错过了什么,但为什么你不能使用正则表达式进行直接拆分== \|\|\||\|,\|?这是一个适合我的测试脚本:

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String subjectString = "Bananas|,|Bananas|||Bananas|Ora" +
        "nges|,|Bananas|||Bananas|Oranges|||Bananas|Oranges|Gre" +
        "en Apples|,|Bananas|||Bananas|Oranges|||Bananas|Orange" +
        "s|Red Apples|,|Bananas|||Bananas|Oranges|||Bananas|Ora" +
        "nges|Pears";
        String[] splitArray = null;
        Pattern regex = Pattern.compile("\\|\\|\\||\\|,\\|");
        splitArray = regex.split(subjectString);
        int i;
        for (i = 0; i < splitArray.length; ++i) {
            System.out.println(splitArray[i]);
        }
    }
}

这是输出:

Bananas
Bananas
Bananas|Oranges
Bananas
Bananas|Oranges
Bananas|Oranges|Green Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Red Apples
Bananas
Bananas|Oranges
Bananas|Oranges|Pears