我如何仅使用正则表达式找到中间字符?
例如,以下是预期输出:
Hello -> l
world -> r merged -> rg(在出现偶数次的情况下)
hi -> hi
I -> I
我尝试过
例如,以下是预期输出:
Hello -> l
world -> r merged -> rg(在出现偶数次的情况下)
hi -> hi
I -> I
我尝试过
(?<=\w+).(?=\w+)
(?<=\w+).(?=\w+)
正则表达式无法按照你期望的方式计数。这似乎是正则表达式无法完成的事情。我建议编写代码来解决这个问题。
String str="Hello";
String mid="";
int len = str.length();
if(len%2==1)
mid= Character.toString(str.getCharAt(len/2));
else
mid= Character.toString(str.getChatAt(len/2))+ Character.toStringstr.getCharAt((len/2)-1));
public static void main(String[] args) {
String s = "jogijogi";
int size = s.length() / 2;
String temp = "";
if (s.length() % 2 == 0) {
temp = s.substring(size - 1, (s.length() - size) + 1);
} else if (s.length() % 2 != 0) {
temp = s.substring(size, (s.length() - size));
} else {
temp = s.substring(1);
}
System.out.println(temp);
}
相关文章: 如何使用正则表达式匹配字符串中的中间字符?
以下正则表达式基于@jaytea的方法,适用于PCRE、Java或C#等编程语言。
^(?:.(?=.+?(.\1?$)))*?(^..?$|..?(?=\1$))
这里是regex101的演示和RegexPlanet上的.NET演示(点击绿色的“.NET”按钮)
中间字符将在第二个捕获组中找到。目标是捕获两个中间字符,如果字符数为偶数,则捕获一个。它通过向末尾(第一组)进行增长捕获,同时懒惰地浏览字符串,直到以每次重复增长的捕获子字符串结尾。使用^..?$
匹配长度为一或两个字符的字符串。
这个“增长”的工作是通过在重复的前瞻中使用捕获来完成的,方法是将一个可选的引用与一个新捕获的字符一起放入同一组中(更多阅读请点击此处)。
具有\K
重置和完全匹配的PCRE变体:^(?:.(?=.+?(.\1?$)))+?\K..?(?=\1$)|^..?
想了解关于“使用平衡组的简单解决方案”@Qtax 在他的问题中提到的内容。