regex 如何创建短正则表达式[已关闭]

w51jfk4q  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(205)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

3年前关闭。
Improve this question
如何创建一个简短的正则表达式,它只匹配后面没有相同字符的单词。
仅允许使用以下Syntax元素:. * +?|()
字母表是{a,b}
示例:

Is matching: abababab

   Not matching: abbab

Thank you:)

uqzxnwby

uqzxnwby1#

嗯,你的练习不是很清楚(你用的是哪个正则表达式引擎?等),但我设法做了一些事情:

(?<=^|\P{L})(?:(\p{L})(?!\1))+(?=\P{L}|$)

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作为word
B**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}|$)
我希望这是你在寻找什么,它不是复杂的理解。

相关问题