Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式也有特定的字母和至少一组字母中的一个_Java_Regex_Search_Letter - Fatal编程技术网

Java 正则表达式也有特定的字母和至少一组字母中的一个

Java 正则表达式也有特定的字母和至少一组字母中的一个,java,regex,search,letter,Java,Regex,Search,Letter,有人能帮我用regex语句找到使用此规则的语句吗 这个词需要有字母“J,U,G”(只是字母而不是顺序)和至少一个字母:G,L,E,R,S 所以我可以搜索一个列表来查找杂耍、变戏法、变戏法、变戏法等等 谢谢你问题的第一部分根本不适合正则表达式。该模式最终将成为一个令人费解的混乱局面,并且只会随着您添加更多必需的字符而变得更糟 然而,第二部分很琐碎: m/[glers]/i 因此,我建议分两部分实施解决方案。这取决于您的语言: C#(使用Linq) Perl(需要5.10) python 还有一个

有人能帮我用regex语句找到使用此规则的语句吗

这个词需要有字母“J,U,G”(只是字母而不是顺序)和至少一个字母:G,L,E,R,S

所以我可以搜索一个列表来查找杂耍、变戏法、变戏法、变戏法等等


谢谢

你问题的第一部分根本不适合正则表达式。该模式最终将成为一个令人费解的混乱局面,并且只会随着您添加更多必需的字符而变得更糟

然而,第二部分很琐碎:

m/[glers]/i
因此,我建议分两部分实施解决方案。这取决于您的语言:

C#(使用Linq) Perl(需要5.10) python
还有一个正则表达式解决方案。但是你真的应该给出你正在使用的语言,因为正如@Quick-Joe-Smith所写的,对于你的任务可能还有其他更好的解决方案

^(?=.*J)(?=.*U)(?=.*G)(?=.*[LERS]).*$
再见

那些
(?=)
是正面的,它们检查字符串中是否有字符,但它们不匹配。最后的
*
将匹配您的完整字符串


您还需要修饰符
i
来启用ignorecase(不区分大小写)

如果一次只处理一个单词,请尝试以下操作:

boolean isMatch = s.matches(
  "(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");
如果要在较长的字符串中搜索匹配项:

Pattern p = Pattern.compile(
    "(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
Matcher m = p.matcher(s);
while (m.find()) {
    String foundString = m.group();
} 
每当前四个备选方案中的一个匹配某个内容时,
J()
U()
G()
[GLERS]()
,它后面的空组就不会“捕获”任何内容(即空字符串)。当到达字符串的末尾时,每个反向引用-
\1
\2
,等等-,都会尝试匹配其相应组匹配的相同内容:再次为空

显然,这将永远成功;你总是可以匹配任何东西。诀窍在于,如果其对应的组没有参与匹配,则反向引用甚至不会尝试匹配。也就是说,如果目标字符串中没有
j
,那么
j()
备选方案中的
()
就不会涉及。当正则表达式引擎稍后处理
\1
反向引用时,它会立即报告失败,因为它知道该组尚未参与匹配

这样,空组就像一个复选框,反向引用确保所有复选框都已选中。不过有一条皱纹。
G()
[GLERS]()
备选方案都可以匹配
G
;当你需要他们参加比赛时,你如何确保他们都参加?我试过的第一个正则表达式

"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"

…未能匹配单词“jugg”,因为
G()
备选方案同时使用了
G
<代码>[GLERS]()从未有机会参与。所以我添加了负前瞻-
(?!*G)
,现在它只匹配最后一个
G
。如果我有三个选项可以匹配
g
,我必须将
(?!*g.*g)
添加到第一个选项,将
(?!*g)
添加到第二个选项。但实际上,在我达到这一点之前,我很可能已经切换到另一种方法(可能不涉及正则表达式)

但是您的示例中的
lugger
没有所有的
J
U
G
都没有意义。需要和至少一个有什么区别?为什么G同时出现在这两个位置?…你编辑的文章包括
gurgle
,但也不包括
J
U
G
。。。
boolean isMatch = s.matches(
  "(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");
Pattern p = Pattern.compile(
    "(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
Matcher m = p.matcher(s);
while (m.find()) {
    String foundString = m.group();
} 
"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"