已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3年前关闭。
Improve this question
如何创建一个简短的正则表达式,它只匹配后面没有相同字符的单词。
仅允许使用以下Syntax元素:. * +?|()
字母表是{a,b}
示例:
Is matching: abababab
Not matching: abbab
Thank you:)
已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3年前关闭。
Improve this question
如何创建一个简短的正则表达式,它只匹配后面没有相同字符的单词。
仅允许使用以下Syntax元素:. * +?|()
字母表是{a,b}
示例:
Is matching: abababab
Not matching: abbab
Thank you:)
1条答案
按热度按时间uqzxnwby1#
嗯,你的练习不是很清楚(你用的是哪个正则表达式引擎?等),但我设法做了一些事情:
https://regex101.com/r/R2t2ik/1
说明
1.我们正在寻找任何类型语言的字符,而不仅仅是
[a-z]
,也不仅仅是单词字符的\w
。这是因为àéêï
通常不匹配。因此,请使用\p{L}
,它用于选择特定的Unicode类。更多详情:https://www.regular-expressions.info/unicode.html#category
1.我们将使用捕获组捕获此char:
(\p{L})
这将创建与数字1的匹配。匹配0是整个正则表达式的匹配。从左到右找到的每个捕获表达式将创建一个新的编号匹配。在我们的例子中,我们将能够使用
\1
引用来引用我们捕获的组。1.为了检查后面的两个字符是否不相同,我们将使用一个负的lookahead,这意味着如果lookahead成功,搜索的项目将不会被选中。
正则表达式变为:
(\p{L})(?!\1)
这意味着:“找到任何语言中没有自己跟随的字母”。
1.现在,一个单词是由一个或多个字符组成的,所以它可以与
\w+
匹配,但如前所述,这只适用于英语。所以在任何语言中,它都将变成(\p{L})+
。\p{L}+
似乎不能正常工作,因此在它周围添加一个组将有助于+
知道应该出现一次或多次的内容。好吧,很好,但这不是我们想要的。我们只想找到没有被自己跟随的字符。所以我们必须在第3点使用我们的模式。
这变成:
(?:(\p{L})(?!\1))+
你可能会问,为什么我们有这个
(?:
和)
围绕着它?这是因为我们可以简单地使用
(
和)+
,但在这种情况下,它会创建一个新的捕获组,我们不需要。因此,要创建一个非捕获组,您必须在开始时添加?:
。捕获组=
(abc)
vs非捕获组=(?:abc)
1.最后,我们希望在正向后看和正向前看的帮助下捕获单词的开头和结尾。我开始使用通常的
\b
作为wordB**oundary,但它不起作用。别问我为什么我希望它与Unicode类的使用有关,或者可能与选择器的编写方式有关。有人可能会找到解释,我不是Maven。好吧,我必须通过尝试将字符串的开始与
^
选择器和\P{L}
Unicode类匹配来选择一个不是语言字符的char来解决这个问题。我使用$
选择器对结尾做了同样的操作。因此,在开始时,我添加了一个积极的lookbehind,意思是“以
(?<=^|\P{L})
规则开始或之前有一个非字母字符”。在最后,我添加了一个积极的前瞻性,意思是“完成或有一个非字母字符后”,用这个
(?=\P{L}|$)
规则完成。1.把所有东西放在一起:
(?<=^|\P{L})
5 +(?:(\p{L})(?!\1))+
4 +(?=\P{L}|$)
5的结果为:(?<=^|\P{L})(?:(\p{L})(?!\1))+(?=\P{L}|$)
我希望这是你在寻找什么,它不是复杂的理解。