仅使用正则表达式查找字符串中间字符

5
我如何仅使用正则表达式找到中间字符?
例如,以下是预期输出:
Hello -> l
world -> r merged -> rg(在出现偶数次的情况下)
hi -> hi
I -> I
我尝试过
(?<=\w+).(?=\w+)

2
我很好奇你为什么要使用正则表达式来处理这个问题的开销。 - BLaZuRE
@BLaZuRE 学习正则表达式 - NAMO
4
@NAMO 这不是学习正则表达式的好方法。要在需要使用它们的情况下学习如何使用它们。 - Maroun
@NAMO 你可以在这里阅读有关正则表达式的信息:http://www.regular-expressions.info/wordboundaries.html - Ruchira Gayan Ranaweera
2
正则表达式并不能解决所有问题。通常情况下,它们非常不擅长解决需要计数或记住数字的问题。 - Patashu
学习正则表达式的正确方法是阅读一本好书,例如Aho、Sethi和Ullman或Freidl。Freidl更实用...但前者(以及类似的书)涵盖了理论知识。 - Stephen C
4个回答

5

正则表达式无法按照你期望的方式计数。这似乎是正则表达式无法完成的事情。我建议编写代码来解决这个问题。


1
+1 - 到目前为止,这是唯一一个真正回答了问题的答案。OP特别想使用正则表达式来理解正则表达式的限制。 - Stephen C

1
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));

这应该可以正常工作。

1
将两个字符相加并不会导致连接(即使顺序颠倒)。无论如何,楼主需要仅使用正则表达式的方法。 - default locale

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);
    }

1
不回答问题...特别是考虑到提问者所陈述的原因。 - Stephen C

0

相关文章: 如何使用正则表达式匹配字符串中的中间字符?


以下正则表达式基于@jaytea的方法,适用于PCRE、Java或C#等编程语言。

^(?:.(?=.+?(.\1?$)))*?(^..?$|..?(?=\1$))

这里是regex101的演示RegexPlanet上的.NET演示(点击绿色的“.NET”按钮)

中间字符将在第二个捕获组中找到。目标是捕获两个中间字符,如果字符数为偶数,则捕获一个。它通过向末尾(第一组)进行增长捕获,同时懒惰地浏览字符串,直到以每次重复增长的捕获子字符串结尾。使用^..?$匹配长度为一或两个字符的字符串。

这个“增长”的工作是通过在重复前瞻中使用捕获来完成的,方法是将一个可选的引用与一个新捕获的字符一起放入同一组中(更多阅读请点击此处)。

具有\K重置完全匹配的PCRE变体:^(?:.(?=.+?(.\1?$)))+?\K..?(?=\1$)|^..?


想了解关于“使用平衡组的简单解决方案”@Qtax 在他的问题中提到的内容。


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