过早客
  • 首页
  • 节点
  • 成员
  • 广告投放
  • 登录
  • 注册

来个正则大佬,帮小弟写个正则表达式

IT技术 • hajkmw • 发表于 2 年前 • 最后回复来自 hajkmw • 2 年前

1、匹配字符串中最多只能有三种不同的字符:
"aaa" 包含a true
"abbabb" 包含ab true
"abbcabbc 包含abc true
"abbccuu" 包含abcu false
"132321123" 包含123 true
"1234234" 包含1234 false
2、匹配字符串中是否有长度>=7的回文子串
"aababcdcbab" babcdcbab 长度9 true
"aaaabcba" abcba 长度5 false
"bb2345432" 2345432 长度7 true

加入收藏 新浪微博 分享到微信 ❤赞 1992 次点击 0 人赞 1 人收藏

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

共收到21条回复
hajkmw 楼主 2 年前 湖北省 #1 赞 0

自顶,大家先不讨论剩男剩女,军事国事、结婚小娃、社会戾气,聊点开心的,做做题吧

Makarios 2 年前 湖北省 #2 赞 0

^(?!(.?(.).?\2){4})[a-zA-Z0-9]+$
\b(\w{7,})(?:(?!\1)\w)+\1\b

letiankaimen 2 年前 湖北省 #3 赞 0

不想死脑细胞,当初遇到一个问题,转csv文档,前人就搞个逗号分割。结果出问题了,害得我找了半天怎么解析csv。

xzcprint 2 年前 湖北省 #4 赞 0

可以使用下面的正则表达式:^(?:(\w)(?!\1)(\w)(?!\1|\2)(\w)){0,2}\w*$

这个正则表达式使用了前行否定断言和后向引用等特性,能够确保匹配的字符串中最多只包含三种不同字符,并且字符的顺序与原字符串相同。具体来说,正则的匹配方式如下:

首先,通过匹配 0 至 2 组符合要求的字符,确定字符串中是否最多只有 3 种不同字符;

然后,判断剩余的字符是否仍然属于这 3 种字符之一,即可得出最终的匹配结果。

以下是 Python 语言中使用该正则表达式的示例代码:

import re

def match_string(s: str) -> bool:
    pattern = r'^(?:(\w)(?!\1)(\w)(?!\1|\2)(\w)){0,2}\w*$'
    return bool(re.match(pattern, s))

其中,正则表达式 ^(?:(\w)(?!\1)(\w)(?!\1|\2)(\w)){0,2}\w*$ 被包含在字符串中,并通过 re.match() 函数进行匹配操作。如果匹配成功,即返回 True,否则返回 False。

Aoo 2 年前 湖北省 #5 赞 0

伸手党脸皮还挺厚

如果是请教, 讨论, 有疑问还可以可以理解

monkey_wp 2 年前 湖北省 #6 赞 0

问问gpt呗

shadow_2019 2 年前 北京市 #7 赞 0

chatgpt粘过去就有了

zzc 2 年前 湖北省 #8 赞 0

可以使用正则表达式^(?:(.)(?!(?1))){0,2}$来匹配字符串中最多只有三种不同的字符。

解释:
- ^ 表示从字符串的开头开始匹配。
- (.) 匹配任意一个字符,并把这个字符捕获到分组1中。
- (?!(?1)) 用于负向预查,表示后面不能跟与分组1中捕获的字符相同的字符。这样就可以确保只有三种不同的字符。
- {0,2} 表示前面的正则表达式出现 0 到 2 次,即最多只能有三种不同的字符。
- $ 表示匹配到字符串的结尾。

所以完整的正则表达式为:^(?:(.)(?!(?1))){0,2}$。

RockLee2020 2 年前 湖北省 #9 赞 0

这个值得v50

hajkmw 楼主 2 年前 湖北省 #10 赞 1

@Aoo 尔康哥,我咋脸皮厚了?

hajkmw 楼主 2 年前 湖北省 #11 赞 0

@shadow_2019 用了chatgpt,但是结果不对

hajkmw 楼主 2 年前 湖北省 #12 赞 0

@RockLee2020 没问题,两个写出来,v50话费

shadow_2019 2 年前 北京市 #13 赞 0

@hajkmw 让他接着改

myandrew13 2 年前 湖北省 #14 赞 1

1、对于第一个问题,正则表达式并不是最好的工具,因为它并不直接支持统计不同字符的数量。然而,如果你确实需要使用正则表达式,你可以使用这个复杂的方式:

regex
Copy code
^(?:(.)(?!.\1)|(.(?!.\2))(.(?!.\3))?.)*$

这个正则表达式会尝试匹配最多三个不同的字符。但请注意,这个表达式的效率可能会比较低,特别是对于较长的字符串。

2、找出长度>=7的回文子串也是一个复杂的问题,正则表达式可能不是最佳选择。因为正则表达式本身不支持“回文”的概念,所以你不能直接使用一个正则表达式来匹配一个回文。然而,你可以编写一个循环,通过在每个可能的子字符串中运行一个检查来解决这个问题。

但是,如果你确定你的回文长度为一个特定的值,例如7,你可以构造一个正则表达式来检查。例如,以下正则表达式会匹配一个长度为7的回文:

regex
Copy code
(.)(.)(.)(.)\4\3\2\1

但这个正则表达式只能匹配长度为7的回文,而不能匹配长度大于7的回文。而且,如果你想匹配不同长度的回文,你需要为每个长度写一个不同的正则表达式,这将会很麻烦。

在大多数情况下,你最好使用一个编程语言来解决这些问题,而不是依赖正则表达式。例如,你可以在Python中使用集合和切片来轻松地解决这两个问题。

huteng 2 年前 湖北省 #15 赞 0

public static boolean hasAtMostThreeDifferentCharacters(String str) {
String regex = "^([a-z])?([a-z])?([a-z])?\1?(?(2)(?!\1)[a-z]|)(?(3)(?!\1|\2)[a-z]|)$";
return Pattern.matches(regex, str);
}

huteng 2 年前 湖北省 #16 赞 0

以上是gpt的回答,试了下是错误的:)

zclzhangcl 2 年前 上海市 #17 赞 0

问了下gpt:
1、^(?:(.)(?:(?!\1)(.)(?:(?!\1|\2)(.))?)?)?$
2、\b(\w)(\w)?(\w)?(\w)?(\w)?(\w)?\1(\w)?(\w)?(\w)?(\w)?(\w)?\b

hajkmw 楼主 2 年前 湖北省 #18 赞 0

@huteng 是的,我也问过,是错的

@zclzhangcl 刚刚试下了,好像也不对

shepeng 2 年前 广东省 #19 赞 0

第一题: /^(.?)\1(.?)(\1|\2)(.?)(\1|\2|\4)$/
第二题: /^.
(.)(.)(.).\3\2\1.*$/
试试、应该可以 (怎么 * 号被吃掉了)

da_shan 2 年前 湖北省 #20 赞 0

如果是代码里面处理,建议写2个方法;如果是sql,建议写一个udf。
这复杂的正则要调试半天

hajkmw 楼主 2 年前 湖北省 #21 赞 0

@da_shan 唉是的,本来说用正则简单点,可以不用改代码,最后还是只能改代码

请绑定手机号后,再发言,点击此处
Guozaoke.com—源自武汉的高端交流分享社区
相关主题
最近时间少了, 隔了这么久, 才做了一个网站
做了一款摸鱼软件,有人要试用吗?
有搞嵌入式硬件的吗?
搞了个AI 生图的网站,不需要登录,永久免费
社友们,你们是怎么入编程这行的?
计算机相关5000本电子书PDF分享
求推荐一个AI智能体客服
关于团队开发习惯
cursor这么强大,web前端是不是要淘汰了
求助,越来越穷了,有没有老板给一些php开发单子做呀!

过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号