在Ruby中按字符集对字符串进行分区/拆分
如何在字符串中分隔不同的字符集?例如,如果我有这些字符集: [a-z] [A-Z] [0-9] [\s] {其他一切} 这个输入: 这是一个测试***1234页 然后我想分离不同的字符集,例如,如果我使用换行符作为分离字符: 这 是 A. 测验 *** 1234 馅饼 我已经尝试过这个正则表达式,具有积极的前瞻性:在Ruby中按字符集对字符串进行分区/拆分,ruby,regex,split,Ruby,Regex,Split,如何在字符串中分隔不同的字符集?例如,如果我有这些字符集: [a-z] [A-Z] [0-9] [\s] {其他一切} 这个输入: 这是一个测试***1234页 然后我想分离不同的字符集,例如,如果我使用换行符作为分离字符: 这 是 A. 测验 *** 1234 馅饼 我已经尝试过这个正则表达式,具有积极的前瞻性: 'thisISaTEST***1234pie'.gsub(/(?=[a-z]+|[A-Z]+|[0-9]+|[\s]+)/, "\n") 但显然+s并不贪婪,因为我得到了: t h
'thisISaTEST***1234pie'.gsub(/(?=[a-z]+|[A-Z]+|[0-9]+|[\s]+)/, "\n")
但显然+s并不贪婪,因为我得到了:
t
h
# (snip)...
S
T***
1
# (snip)...
e
我删掉了不相关的部分,但正如您所看到的,每个字符都作为自己的字符集计算,除了{everything else}字符集
我该怎么做?它不一定必须由正则表达式来定义。将它们拆分成一个数组也会起作用。困难的部分是匹配与正则表达式其余部分不匹配的内容。忘了这一点,想想一种方法,可以将不匹配的部分与匹配的部分混合在一起
"thisISaTEST***1234pie"
.split(/([a-z]+|[A-Z]+|\d+|\s+)/).reject(&:empty?)
# => ["this", "IS", "a", "TEST", "***", "1234", "pie"]
困难的部分是匹配任何与正则表达式其余部分不匹配的内容。忘了这一点,想想一种方法,可以将不匹配的部分与匹配的部分混合在一起
"thisISaTEST***1234pie"
.split(/([a-z]+|[A-Z]+|\d+|\s+)/).reject(&:empty?)
# => ["this", "IS", "a", "TEST", "***", "1234", "pie"]
在ASCII字符集中,除了字母数字和空格外,还有32个标点字符,它们与属性构造\p{punct}匹配 要将字符串拆分为单个类别的序列,可以编写
str = 'thisISaTEST***1234pie'
p str.scan(/\G(?:[a-z]+|[A-Z]+|\d+|\s+|[\p{punct}]+)/)
输出
或者,如果字符串包含ASCII集合之外的字符,则可以根据属性编写整个字符串,如下所示
p str.scan(/\G(?:\p{lower}+|\p{upper}+|\p{digit}+|\p{space}|[^\p{alnum}\p{space}]+)/)
在ASCII字符集中,除了字母数字和空格外,还有32个标点字符,它们与属性构造\p{punct}匹配 要将字符串拆分为单个类别的序列,可以编写
str = 'thisISaTEST***1234pie'
p str.scan(/\G(?:[a-z]+|[A-Z]+|\d+|\s+|[\p{punct}]+)/)
输出
或者,如果字符串包含ASCII集合之外的字符,则可以根据属性编写整个字符串,如下所示
p str.scan(/\G(?:\p{lower}+|\p{upper}+|\p{digit}+|\p{space}|[^\p{alnum}\p{space}]+)/)
非字、非空格字符可以用[^\w\s]覆盖,因此:
非字、非空格字符可以用[^\w\s]覆盖,因此: 这里有两个解决方案 用正则表达式 由于[^a-zA-Z\d\s]开头的“^”,该字符类与除字母小写和大写、数字和空白以外的任何字符都匹配 使用1 首先,助手方法:
def type(c)
case c
when /[a-z]/ then 0
when /[A-Z]/ then 1
when /\d/ then 2
when /\s/ then 3
else 4
end
end
比如说,
type "f" #=> 0
type "P" #=> 1
type "3" #=> 2
type "\n" #=> 3
type "*" #=> 4
然后
一,。slich_在Ruby v2.4中首次亮相。这里有两个解决方案
用正则表达式
由于[^a-zA-Z\d\s]开头的“^”,该字符类与除字母小写和大写、数字和空白以外的任何字符都匹配
使用1
首先,助手方法:
def type(c)
case c
when /[a-z]/ then 0
when /[A-Z]/ then 1
when /\d/ then 2
when /\s/ then 3
else 4
end
end
比如说,
type "f" #=> 0
type "P" #=> 1
type "3" #=> 2
type "\n" #=> 3
type "*" #=> 4
然后
一,。slich_在Ruby v2.4中首次亮相。为这个糟糕的标题感到抱歉;我想不出比这更好的了。如果你了解我想要什么,并且你能想出一个更好的,请编辑为这个糟糕的标题感到抱歉;我想不出比这更好的了。如果你了解我想要什么,并且你能想出一个更好的,请编辑我不想只使用标点符号,我希望其他字符也能使用。我试图解释,在字母数字和空格之后剩下的就是标点符号和控制字符。当然,如果您的数据包含ASCII集以外的字符,则这不起作用。不过,我不希望仅使用标点符号,我希望任何其他字符也能起作用。我试图解释,在字母数字和空格之后剩下的只是标点符号和控制字符。当然,如果您的数据包含ASCII集以外的字符,则这不起作用。@sawa-uu是一个单词char,但它不适合这些组中的任何一个,因此不清楚它属于何处。它显然属于OP的其他所有内容,但它不适合正则表达式中的任何地方。@sawa将u放入其他所有内容:?:[^\w\s]|_@sawa-u是一个单词char,但它不适合任何这些组,因此不清楚它属于何处。它显然属于OP的其他所有内容,但不适合正则表达式中的任何地方。@sawa将u适合于其他所有内容:?:[^\w\s]|_