java的正则表达式惰性解决方案?
我有一个字符串“java的正则表达式惰性解决方案?,java,regex,Java,Regex,我有一个字符串“hooRayNexTcapItaLnextcapitall” 我想捕获“next”的第一个实例(next——在本例中) 我的灵魂: (.*)([nN][eE][xX][tT])([cC][aA][pP][iI][tT][aA][lL])(.*) 我的解决方案组1返回next,而不是next 如何更正正则表达式以捕获第一个下一个而不是捕获最后一个下一个 编辑1: 让我恰当地提出我的问题 如果字符串包含拼写为“NextCapital”的大写字母和小写字母的任意组合,请反转单词“Ne
hooRayNexTcapItaLnextcapitall
”
我想捕获“next
”的第一个实例(next
——在本例中)
我的灵魂:
(.*)([nN][eE][xX][tT])([cC][aA][pP][iI][tT][aA][lL])(.*)
我的解决方案组1返回next
,而不是next
如何更正正则表达式以捕获第一个下一个而不是捕获最后一个下一个
编辑1:
让我恰当地提出我的问题
如果字符串包含拼写为“NextCapital”的大写字母和小写字母的任意组合,请反转单词“Next”的字符。案件应予以保留。如果“NextCapital”出现多次,只更新第一次出现的内容
所以,我使用组来捕获。但我的团队正在捕捉“nextCapital”的最后一次事件,而不是第一次
例:
输入:HoorayNextCapitalNextCapitalAll
输出:hooraytxencapitalnextcapital
编辑2:
请更正我的密码。
我的java代码:
Pattern ptn = Pattern.compile("(.*)([nN][eE][xX][tT])([cC][aA][pP][iI][tT][aA][lL])(.*)");
//sb = hooRayNexTcapItaLnextcapitall
Matcher mtc = ptn.matcher(sb);
StringBuilder c = new StringBuilder();
if(mtc.find()){
StringBuilder d = new StringBuilder();
StringBuilder e = new StringBuilder();
d.append(mtc.group(1));
e.append(mtc.group(2));
e.reverse();
d.append(e);
d.append(mtc.group(3));
d.append(mtc.group(4));
sb = d;
}
这将是我第一次尝试,允许调整所需字符串的位置
否则,您可以使用此正则表达式解决方案来实现相同的效果:
Pattern pattern = Pattern.compile("(?i)next");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
System.out.println(matcher.group());
}
模式“(?i)next”查找与忽略大小写“next”匹配的子字符串
编辑:这将颠倒下一个事件第一次出现的顺序
String input = "hooRayNexTcapItaLnextcapitall";
String target = "nextcapital";
int index = input.toLowerCase().indexOf(target);
if (index != -1) {
String first = input.substring(index, index + target.length());
first = new StringBuilder(first.substring(0, 4)).reverse().toString() + first.substring(4, first.length());
input = input.substring(0, index) + first + input.substring(index + target.length(), input.length());
}
再次编辑:这里是代码的“固定”形式
String input = "hooRayNexTcapItaLnextcapitall";
Pattern ptn = Pattern.compile("([nN][eE][xX][tT])([cC][aA][pP][iI][tT][aA][lL])");
Matcher mtc = ptn.matcher(input);
if(mtc.find()){
StringBuilder d = new StringBuilder(mtc.group(1));
StringBuilder e = new StringBuilder(mtc.group(2));
input = input.replaceFirst(d.toString() + e.toString(), d.reverse().toString() + e.toString());
System.out.println(input);
}
如果你得到第2组,你的正则表达式实际上是有效的。试试看!你的正则表达式不需要那么复杂 您的正则表达式可以是:
next
如果使用Matcher.find
并启用不区分大小写
选项,则可以找到与模式匹配的字符串的第一个子字符串。然后,使用group()
获取实际字符串:
Matcher matcher = Pattern.compile("next", Pattern.CASE_INSENSITIVE).matcher("hooRayNexTcapItaLnextcapitall");
if (matcher.find()) {
System.out.println(matcher.group());
}
编辑:
看到您的需求后,我编写了以下代码:
String input = "hooRayNexTcapItaLnextcapitall";
Matcher m = Pattern.compile("next(?=capital)", Pattern.CASE_INSENSITIVE).matcher(input);
if (m.find()) {
StringBuilder outputBuilder = new StringBuilder(input);
StringBuilder reverseBuilder = new StringBuilder(input.substring(m.start(), m.end()));
outputBuilder.replace(m.start(), m.end(), reverseBuilder.reverse().toString());
System.out.println(outputBuilder);
}
我使用了一个向前看来匹配
next
,前提是后面有大写字母。找到匹配项后,我使用输入创建了一个字符串生成器,并使用输入的匹配部分创建了另一个字符串生成器。然后,我用第二个字符串生成器的反面替换了匹配的范围。由于正则表达式的默认贪婪性质,您的正则表达式正在为您的组获取第二个潜在匹配项。实际上,第一个(.*)
在满足剩余正则表达式的同时,尽可能多地获取数据
要获得您想要的内容,您可以在第一组中添加问号,使其成为(.*)
。这将使它不贪婪,抓住尽可能小的字符串,同时仍然满足剩余的正则表达式。请您再次检查问题。我已经编辑好了,把问题陈述清楚了。你能再检查一下这个问题吗。我已对其进行编辑,并使问题陈述清晰。已更新。它有点笨重,所以您可能需要分成不同的方法(比如reverseOrder(String s,int start,int end)来反转字符的顺序)?我对正则表达式解决方案感兴趣。我已经在上面发布了我的代码。让我们看看你的代码。可能是因为某个错误导致您查看第二个匹配项,而不是您的正则表达式不正确。@phatfingers我已经在上面发布了我的代码。你能检查一下吗?我正在寻找正则表达式的解决方案。你是一个字符从有工作代码。我已经发布了答案。
String input = "hooRayNexTcapItaLnextcapitall";
Matcher m = Pattern.compile("next(?=capital)", Pattern.CASE_INSENSITIVE).matcher(input);
if (m.find()) {
StringBuilder outputBuilder = new StringBuilder(input);
StringBuilder reverseBuilder = new StringBuilder(input.substring(m.start(), m.end()));
outputBuilder.replace(m.start(), m.end(), reverseBuilder.reverse().toString());
System.out.println(outputBuilder);
}