如何匹配以相同字母开头和结尾的字符串?

13

如何编写一个正则表达式,其中包含字符{x,y},但必须以相同的字母开头和结尾? 例如:

  • xyyyxyx
  • yxyxyxy

1
这个正则表达式是否包含长度为0(epsilon)的字符串? - Prashant Kumar Gupta
10个回答

13

这应该适合您的需求:

^(x|y).*\1$

这个正则表达式将匹配以相同字母开头和结尾的字符串(如帖子标题所示),但它不限制字符串仅包含x和y字符。它将匹配任何以括号中指定的相同字母开头和结尾的字符串。

它将匹配由{x,y}字符组成的、以相同字母开头和结尾的字符串(如OP所指定)。

xyyyxyx
yxyxyxy
zxyxyxz
xyxyxyy

但它也将匹配在两者之间具有任何字符的字符串(不仅限于x和y):

xgjyhdtfx
yjsaudgty
xuhgrey
yudgfsx
yaaay

工作的正则表达式示例:

https://regex101.com/r/TER7zI/1


11

这个正则表达式有效:

^([xy])[xy]*\1$|^[xy]$

I tested it on regexr with

xyyyxyx
yxyxyxy
x
y
xyyyxyy
yxyxyxx
xyzyxx
z

而且它只匹配了前四个。


5
我不太擅长正则表达式,但我认为这将是有效的。
^(([x][xy]*[x])|([y][xy]*[y])|[x|y])$

2
以下正则表达式适用于sed。
^\(.\).*\1$

查找您需要的内容。


1
^(a).*(a)$|^(b).*(b)$

这个方法是可行的。我已经进行了测试,测试结果如下:

  • aba - true

  • abbb - false

  • bab - true

  • abababa - true

  • aba - true

  • aaaabbbbbaaa

解释:

第一种情况 ^(a).*(a)$

  • ^ 表示行首

第一组捕获 (a)

  • a 匹配字符 a (区分大小写)
  • . 匹配除换行符之外的任意字符
  • * 匹配前面的标记零次或多次,尽可能多地匹配(贪婪模式)

第二组捕获 (a)

  • a 匹配字符 a (区分大小写)
  • $ 表示行尾

第二种情况 ^(b).*(b)$

  • ^ 表示行首

第三组捕获 (b)

  • b 匹配字符 b (区分大小写)
  • . 匹配除换行符之外的任意字符
  • * 匹配前面的标记零次或多次,尽可能多地匹配(贪婪模式)

第四组捕获 (b)

  • b 匹配字符 b (区分大小写)
  • $ 表示行尾

全局模式标志

  • g 修饰符:全局。查找所有匹配而非在找到第一个匹配后停止。
  • m 修饰符:多行。^ 和 $ 不仅匹配字符串的开始和结束,还匹配行的开始和结束。

1

要更正的正则表达式是^(x).(x)$|^(y).(y)$|^([xy])[xy]*\1$|^[xy]$

在这里,我们使用所有验证匹配字符串中出现x和y的起始和结束字符。


1

1

您可以使用:

/^([xy]|[xy]).*\1$/

我已经使用以下测试案例进行了测试:(它与粗体匹配)
xyyyxyx yxyxyxy x y xyyyxyy yxyxyxx xyzyxx z

0

0
这个正则表达式对我来说很有效,并且可以让你更好地控制起始和结束值 ^(x|y).*(x|y)$
import re
#Check if the string starts with "x or y" and ends with "x or y":

txt = "xyyyxyx"
x1 = re.search("^(x|y).*(x|y)$", txt)

txt2 = "yxyxyxy"
x2 = re.search("^(x|y).*(x|y)$", txt2)

if x1:
  print("YES! We have a match!")
# YES! We have a match!

if x2:
  print("YES! We have a match!")
# YES! We have a match!

^(x|y) <<-- 这意味着以 x 或者 y 开始,您可以替换 x 和 y 的值或添加更多内容

.* <<-- 表示在开始和结束值之间有零个或多个字符

(x|y)$ <<-- 与开始一样,但以 x 或 y 值结尾,我们可以替换 x 或 y 或添加新值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接