让
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
,则最后一个应该是匹配项。
假设您定义了
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
匹配。
Julia 演示如果我误解了你的问题,并且子字符串不允许包含 1
、或
5
或
6
(除了最后),你可以将正则表达式更改为:
pattern_string = Regex("[234]{$n,}(?:6|5{$(m+1),})")
这只会匹配一系列 n
或更多
2
、
3
或
4
,后跟
6
或
m+1
或更多
5
。对于您的示例数据,这与相同的子字符串匹配。
Julia 演示