首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >正则表达式重复字符(\\1无效)

正则表达式重复字符(\\1无效)
EN

Stack Overflow用户
提问于 2016-04-06 20:54:54
回答 2查看 90关注 0票数 4

我目前正在尝试在Java中创建一个regex,如果输入字符串中存在任何重复的字符,则返回true,否则返回false,并使用尽可能短的regex (用于代码高尔夫挑战)。我不太擅长正则表达式,但我认为这会很有用:

代码语言:javascript
代码运行次数:0
运行
复制
(.)\\1

其中,(.)是任意字符,\\1是对正则表达式第一部分中找到的匹配项的引用。

但是,如果我尝试输入"1223",它不能工作:

代码语言:javascript
代码运行次数:0
运行
复制
public static void main(String[] a){
     System.out.println(java.util.regex.Pattern.matches("(.)\\1", "1223"));
}

这返回false,而由于22,我期望返回true。

有谁知道如何使用java.util.regex.Pattern.matches或更短的代码来修复正则表达式,因为它是代码高尔夫?;)

Here is an ideone for the test.

EN

回答 2

Stack Overflow用户

发布于 2016-04-06 20:58:52

Pattern.matches(regex, sequence)返回整个字符串是否与regex对应,而不是返回匹配的子字符串是否存在。

对于你正在尝试做的事情,你可以做以下两件事之一:

使用正则表达式代替

  • 使用Matcher类:Matcher m=
  1. = m.start();int end = m.end();
票数 3
EN

Stack Overflow用户

发布于 2016-04-06 20:59:08

matches使用整个字符串:首先.匹配"1",然后\\1尝试匹配"1“作为下一个字符,但失败了。

您有两个选择:

  • 使用find
  • 将正则表达式更改为.*(.)\\1.*

解释:

第二种选择现在可以用了,因为.*将首先匹配整个字符串,然后它将无法匹配\\1,它将逐个字符回溯,直到.*匹配"1",然后(.)\\1将匹配"22",最后的.*将匹配字符串的其余部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36451800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档