在Ruby中按字符集对字符串进行分区/拆分

在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

如何在字符串中分隔不同的字符集?例如,如果我有这些字符集:

[a-z] [A-Z] [0-9] [\s] {其他一切} 这个输入:

这是一个测试***1234页 然后我想分离不同的字符集,例如,如果我使用换行符作为分离字符:

这 是 A. 测验 *** 1234 馅饼 我已经尝试过这个正则表达式,具有积极的前瞻性:

'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]|_