当前位置: 首页 > 知识库问答 >
问题:

正则表达式 - 重复 2 个字母 1 个

戚祺
2023-03-14

我有一个代码,使用一些逻辑生成一些单词,我有正则表达式1(见下文)。但是我需要生成正确的单词,例如单词1。我的逻辑包括我提到的数学模式。我需要正确的模式来生成单词,例如单词1而不是2。模式的逻辑是:

  1. 该单词以大写元音或辅音开头
  2. 长度为(整个单词的)2个或更多符号
  3. 一行不应超过两个元音或辅音
Aakemenkyu
Klepathass
Waknampite
Flaetobsak
Oladkinqyt
Mmalinnetj

等等

这些是单词 1

[A-Z](([aei ou y]|[bcd fg hj klm np qrs tv w x z]){1,2})*

这是正则表达式 1

这个正则表达式不起作用,我的代码逻辑生成了下一个单词:

Ijythlzuoe
Tervkpxyib
Ifuemkoeui
Mqjtobojex
Ephyrjiuau

这些是单词 2

例如,在单词Ijythlzuoe中有thl(辅音连续重复3次)和uoe(元音重复)

请帮帮忙。

共有3个答案

司马祖鹤
2023-03-14

正则表达式(?=[A-Z][A-Za-z])(? i)(?!.*[aeiouy]{3}|。*[^aeiouy]{3})[a-z]应该满足您的要求。

regex101中正则表达式的解释:

演示:

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream.of("Aakemenkyu",
                  "Klepathass",
                  "Waknampite",
                  "Flaetobsak",
                  "Oladkinqyt",
                  "Mmalinnetj",
                  "Ijythlzuoe",
                  "Tervkpxyib",
                  "Ifuemkoeui",
                  "Mqjtobojex",
                  "Ephyrjiuau").forEach( s -> {
                      System.out.println(s + " => " + s.matches("(?=[A-Z][A-Za-z])(?i)(?!.*[aeiouy]{3}|.*[^aeiouy]{3})[a-z]+"));
                  });
    }
}

输出:

Aakemenkyu => true
Klepathass => true
Waknampite => true
Flaetobsak => true
Oladkinqyt => true
Mmalinnetj => true
Ijythlzuoe => false
Tervkpxyib => false
Ifuemkoeui => false
Mqjtobojex => false
Ephyrjiuau => false
施飞驰
2023-03-14

您可以尝试:

^(?=[A-Z][a-z]*$)(?i)(?!.*[aeiouy]{3}|.*[^aeiouy\n]{3})[a-z]+$

查看在线演示

  • ^-开始字符串定位
  • (?=[A-Z][A-Z]*$)-正向前看以大写字母开始字符串,而余数以小写结尾
  • (?i)-匹配余数不区分大小写的内联修饰符
  • (?!-打开负前瞻:<ul>
  • <代码>*[aeiouy]{3}-匹配类中的任意三个连续字符
  • |-或:
  • <代码>*[^aeiouy\n]{3}-匹配不在类中的任意三个连续字符
  • -关闭负前瞻
苏鸿羽
2023-03-14

我认为“生成”实际上是想说“匹配”。

您可以使用此正则表达式来验证 1-2 个辅音,后跟 1-2 个元音,反之亦然:

/^(([aeiouy]){1,2})?(([bcdfghjklmnpqrstvwxz]){1,2}([aeiouy]){1,2})*(([bcdfghjklmnpqrstvwxz]){1,2})?$/i

使用JavaScript的测试用例,但此正则表达式可以使用任何语言:

const regex = /^(([aeiouy]){1,2})?(([bcdfghjklmnpqrstvwxz]){1,2}([aeiouy]){1,2})*(([bcdfghjklmnpqrstvwxz]){1,2})?$/i;
[
  'Aakemenkyu',
  'Klepathass',
  'Waknampite',
  'Flaetobsak',
  'Oladkinqyt',
  'Mmalinnetj',
  'Ijythlzuoe',
  'Tervkpxyib',
  'Ifuemkoeui',
  'Mqjtobojex',
  'Ephyrjiuau'
].forEach(str => {
  console.log(str + ' => ' + regex.test(str));
});
 类似资料:
  • 问题内容: 有没有办法使用正则表达式来匹配重复的字符集?例如: 我知道那是错的。但是有什么可以匹配这种效果的吗? 更新: 您可以使用嵌套捕获组吗?像什么? 问题答案: 将要重复的正则表达式放在括号中。例如,如果您要重复5次: 或者,如果您想要任意数量的重复(0或更多): 或一个或多个重复: 编辑 以回应更新 正则表达式中的括号有两个作用:它们将正则表达式中的一系列项目组合在一起,以便您可以将运算符

  • 我正在尝试匹配这个片段中的“Б.Γ”。通常,首字母应该没有空格,所以我需要一个可以解释可选空格的正则表达式。 我一直在使用: 但是好像和这个不太对。我不确定为什么。注意,我在java中的“s”和“s”之前键入< code>\\。有人能发现错误吗?

  • 问题内容: 我想匹配aaaa,aaaad,adjjjjk之类的内容。类似于([az])\ 1+的字符被用来匹配重复的字符,但是我无法用四个字母来解决这个问题。 问题答案: 不知道有限重复语法,您自己的问题解决能力应带您前往: 显然,它并不漂亮,但是: 有用 它锻炼您自己的问题解决能力 它可能会导致您对概念有更深入的了解 在这种情况下,了解有限重复语法的简化形式 我有一个担忧: 下两个我该怎么办?

  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?

  • 我正在尝试编写一个正则表达式,使其只有两个单词,它们之间只有一个空格。两个字都不能少于三个字符。例子:乔·史密斯