检查字符串是否仅包含特定重复的特殊字符

4

我有一个格式为^%^%^%^%的字符串。我需要检查该字符串是否仅由^%重复模式组成,不能包含其他任何内容。

例如:

1. ^%^%^%^% > Valid

2. ^%^%aa^%^% > Invalid

3. ^%^%^%^%^%^% > Valid

4. ^%^%^^%^% > Invalid

5. %^%^%^%^% > Invalid

我应该如何在Java中实现这个功能?

我尝试过:

String text = "^%^%^%^%^%";
if (Pattern.matches(("[\\^\\%]+"), text)==true) {
    System.out.println("Valid");
} else {
    System.out.println("Invalid");
}

然而,就第四和第五种情况而言,它是有效的。

您可以在此处使用 https://regex101.com/ 检查您的正则表达式,然后将其用于您的程序中。或者您可以查看此网站:https://www.rexegg.com/regex-quickstart.html 了解如何构建正则表达式。 - Pawan Tiwari
1
将你的 [ ] 改为 ( )。另外,你不需要其中任何一个:\ - Patrick Parker
谢谢,我认为它有效,除了我仍然需要 \ - Nick
哦,是的,^ 需要被转义。否则它会表示输入/行的开头。 - Patrick Parker
4个回答

3

在您的模式中,您使用了一个字符类,它仅匹配所列出的字符之一,然后重复匹配1次或更多次。

您可以使用^锚定字符串的开头,并以$断言字符串的结尾。

然后重复1次或更多次匹配\\^%

^(?:\\^%)+$

正则表达式演示


恭喜。唯一解释了他做错了什么的答案。 - Patrick Parker
谢谢,以上也可以。那么使用(\^%)+作为正则表达式模式怎么样? - Nick
@Nick 这也是可能的。你会得到一个捕获组,其中包含 ^% 的最后一次迭代。 - The fourth bird

2
尝试使用这个模式:^(?:\^%)+$ 解释: ^ - 匹配字符串的开头 (?:...) - 非捕获组 \^% - 字面匹配^% (?:\^%)+ - 匹配一个或多个^% $ - 匹配字符串的结尾
演示: Demo 将原始答案翻译成“最初的回答”。

2
你可以简单地这样做:

最初的回答:

if (str.replace("^%", "").isEmpty()) {
    …
}
< p > replace 方法会尽可能多地替换字符串,因此它非常适合您的需求。

它还匹配空字符串,根据规范,"除了此模式之外什么也没有"。在这种情况下,您应该始终询问是否也包括空字符串。

注: "Original Answer" 翻译成 "最初的回答"

-1
String[] text = {"^%^%^%^%","^%^%aa^%^%","^%^%^%^%^%^%","^%^%^^%^%","%^%^%^%^%" };
for (String t: text) {
    if(Pattern.matches(("[\\^\\%]+[a-z]*[a-z]*[(\\^\\%)]+"), t)==true) {
            System.out.println("Valid");
    } else {
            System.out.println("Invalid");
    }

}


1
正则表达式中不应包含任何字母,这要么是错误的,要么是多余的。 - Roland Illig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接