我正在尝试为字符串编写一个正则表达式。让我们说有一个字符串RBY_YBR,其中_代表空,所以我们可以递归替换字母和_,结果是RRBBYY_。可以形成两个或更多个字母对,或者类似这样的还有RRR。
条件
1)。左或右字母应该相同。
2)。如果没有_那么字母应该像RRBBYY而不是RBRBYY或RBYRBY等。
3)。可以有多个下划线_。
从正则表达式我试图找到给定的字符串是否可以满足正则表达式通过用_替换字符形成连续字母的模式
我写的正则表达式是
String regEx = "[A-ZA-Z_]";
但这个正则表达式对于RBRB来说是失败的。因为没有空的空间来替换字符,而RBRB也不是一种模式 我怎么能写出有效的正则表达式来解决这个问题。
答案 0 :(得分:1)
好的,据我所知,匹配的字符串要么只包含相同的字符组合在一起,或必须包含至少一个下划线。
因此,RRRBBR无效,而RRRRBB,RRRBBR_和RRRBB_R_都有效。
在问题创建者的评论之后,附加条件:每个角色必须出现0或2次或更多次。
据我所知,正则表达式是不可能的,因为正则表达式是没有“存储”的有限状态机。您必须“存储”字符串中找到的每个字符,以检查它以后不会再出现。
我建议用一种非常简单的方法来验证这些字符串:
public static boolean matchesMyPattern(String s) {
boolean withUnderscore = s.contains("_");
int[] found = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch != '_' && (ch < 'A' || ch > 'Z')) {
return false;
}
if (ch != '_' && i > 0 && s.charAt(i - 1) != ch && found[ch - 'A'] > 0
&& !withUnderscore) {
return false;
}
if (ch != '_') {
found[ch - 'A']++;
}
}
for (int i = 0; i < found.length; i++) {
if (found[i] == 1) {
return false;
}
}
return true;
}
答案 1 :(得分:0)
请带上我的答案,因为它有点像“西方最快的枪”。
它遵循与Florian Albrecht的回答相同的假设。 (感谢)
我相信这会解决你的问题:
(([A-Za-z])(\2|_)+)+
https://regex101.com/r/7TfSVc/1
它的工作原理是使用第二个捕获组并确保其中有更多的捕获组,或者有下划线。
已知错误:如果下划线开始一个字符串,它就不起作用。
这个更好,虽然我忘了它到底做了什么。
(([A-Za-z_])(\2|_)+|_+[A-Za-z]_*)+