查找与复杂模式匹配的所有子字符串

问题描述 投票:0回答:1

alpha
从集合
1, 2, 3, 4, 5, 6
中随机采样元素的字符串。例如,
alpha
可以是
"1132345216"

假设

alpha
足够长以包含至少四个满足以下条件的子字符串:

  • 子字符串以长度为
    N
    的序列开头,其中包含
    2
    3
    和/或
    4
    ,顺序任意,可能重复或缺失。例如,子字符串可能以
    2222...
    234234234...
    开头。
  • 子字符串以以下两种模式之一结尾:一个
    6
    或多个
    M
    个字符
    5

例如,

"2346"
"23455"
将满足属性,如果
N = 3
M = 2

我想在 Julia 的

alpha
中找到所有此类子字符串。当然,人们会想到正则表达式。我从形式语言理论的角度对正则表达式有些了解,但我从未在编程语言中使用过它们,并且存在差异。我没能达到想要的结果。

为任何想尝试此操作的人提供快速示例代码:

pattern_string = r"..." # What's the right regex???

# Test string to search for matches
test_string = "1111122211111 2323232234233246 5161532161 232342342322224444223323555555"

# Find all matches in the test string
matches = eachmatch(pattern_str, test_string)
# Output the matches found
println("Matches found:")
for match in matches
    println(match.match)
end

在示例中,我添加了空格以提高视觉清晰度;第一个子字符串(第一个空格之前)不应该是匹配项,第二个子字符串应该是小

N
;第三个不应该是匹配项,如果
M
小于
6
,则最后一个应该是匹配项。

regex string julia pattern-matching
1个回答
0
投票

假设您定义了

n
m
变量,您可以使用插值字符串创建正则表达式:

n=10
m=4

pattern_string = Regex("[234]{$n}[1-6]*?(?:6|5{$(m+1),})")

对于示例数据,给出的模式字符串为

[234]{10}[1-6]*?(?:6|5{6,})

此匹配:

  • [234]{10}
    :10 个
    2
    3
    4
    ,任意顺序
  • [1-6]*?
    :最少数量的
    1-6
  • (?:6|5{6,})
    :一个
    6
    ,或者 6 个或更多
    5

对于您的示例数据,这与

2323232234233246
232342342322224444223323555555
匹配。

regex101 上的正则表达式演示

Julia 演示

在线试用!

如果我误解了你的问题,并且子字符串不允许包含

1

、或 
5
6
(除了最后),你可以将正则表达式更改为:

pattern_string = Regex("[234]{$n,}(?:6|5{$(m+1),})")
这只会匹配一系列 

n

 或更多 
2
3
4
,后跟 
6
m+1
 或更多 
5

对于您的示例数据,这与相同的子字符串匹配。

Julia 演示

在线试用!

© www.soinside.com 2019 - 2024. All rights reserved.