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

正则表达式模式在最后一次重复中的不同行为

傅玮
2023-03-14

我有一个字符串单词1。word2.word3.word1。word2.word3。字4。字5,字1。word2我会创建正则表达式来匹配它。我有一个限制,我必须有0到5个单词,由一个点分隔,然后我可以添加一个逗号,我最多可以重复三次

我尝试了一下,成功地匹配了字符串,除了最后一个字符,这是我的正则表达式

^(((?:\w+){1}(?:\.(?:\w+)){0,4})(?:\,{1})){0,3}$

它与以下字符串匹配:word1。word2.word3.word1。word2.word3。字4。字5,字1。文字2,

我的问题是如何从表达式中删除最后一个逗号?

共有2个答案

黄弘盛
2023-03-14

您可以使用

^(?:\w+(?:\.\w+){0,4}(?:,(?!$)|$)){0,3}$

请参阅正则表达式演示。细节:

  • ^-字符串的开头

鲁霄
2023-03-14

您可以尝试匹配正则表达式

^(?:\w+(?:\.\w+){0,4}(?:,\w+(?:\.\w+){0,4}){0,3})?$

PCRE演示

要理解正在执行的操作,请将光标悬停在链接处表达式的每个部分上,以获取对其功能的解释。

我对这个问题的理解是要匹配空字符串。这就是可选外部非捕获组的原因(也是唯一原因)。(我也可以使用替代:^$|^\w…{0,3})$ )如果不匹配空字符串,则可以删除非捕获组:

^\w+(?:\.\w+){0,4}(?:,\w+(?:\.\w+){0,4}){0,3}$

注意党帽所表示的重复:

^(?:\w+(?:\.\w+){0,4}(?:,\w+(?:\.\w+){0,4}){0,3})?$
    ^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^

这使得该表达式成为使用子例程(或子表达式)的良好候选者,前提是所使用的正则表达式引擎支持该表达式。对于PCRE,这将是

^(?:(\w+(?:\.\w+){0,4})(?:,(?1)){0,3})?$

如果使用编号捕获。如果首选命名捕获组,则可以编写

^(?:(?P<words_sep_by_periods>\w+(?:\.\w+){0,4})(?:,(?P>words_sep_by_periods)){0,3})?$

<代码>(?1)(? P

带子程序的PCRE演示

子例程的使用通常使正则表达式代码更容易理解(无论如何,我的观点),并减少了在构建表达式时引入错误的机会。

 类似资料:
  • 这是我的问题。我有这个: 然而,它并不匹配。为什么?我试图检索括号内的数字。 我应该尝试什么?

  • 问题内容: 当我使用上面的代码时,没关系。但是我不明白使用此regexpr时发生了什么。它打印。 如何将圆点作为特定符号?还是如何使一类具有\ n和\ r的任意字符的符号? 问题答案: 但是我不明白使用此regexpr [。] *会发生什么情况。说我错了。 因为在字符类中,点失去了特殊的意义,将与普通的旧点(字符)匹配。 在字符类之外,点是一个与任何字符匹配的元字符,不包括换行符(当然,除非使用修

  • 有几个问题,但没有回答我的问题。我希望使用pattern和matcher在字符串中找到一个模式,然后从那里创建一个匹配列表,其中包括不匹配的其余部分。 我目前的结果: 假的 我的预期结果应该在列表中: ["125t","160f"]//我知道如何在python中做到这一点,但不知道如何在java中做到这一点。所以有人能帮我吗?

  • 问题内容: 我将如何使用Java中的regex在一行中找到多个匹配项? 我的代码(包括正则表达式): 我在其中使用的部分字符串: 这适用于第一次出现(实际上是整个字符串),但是由于认为整个字符串是第一次出现,因此不再赘述。 希望您理解我要说的内容,但我不知道该如何解释得更清楚。 --EDIT我也尝试过用以下命令替换正则表达式: 我认为这样做只会将一个行字符串的一部分视为一个出现,从而解决了我的问题

  • 如何提取所有字符(包括换行符),直到第一次出现单词序列?例如以下输入: 输入文本: 和序列我想从中提取文本到第二行中第一次出现的。 输出必须为- 我整个上午都在努力。我可以编写表达式来提取所有字符,直到遇到特定字符,但如果我使用这样的表达式: 跨换行符不匹配。