Ruby 拆分字符串会丢失用于拆分字符串的单词

Ruby 拆分字符串会丢失用于拆分字符串的单词,ruby,Ruby,我有一根绳子 a="Tamilnadu is far away from Kashmir" 如果我使用“Tamilnadu”拆分这个字符串,那么我没有发现Tamilnadu是数组的一部分,我在那里找到空字符串,如果我拆分字符串“away”,那么away在结果数组中不存在,它在away的位置有空字符串。我应该做什么来包含它,而不是使用空字符串 范例 a="Tamilnadu is far away from Kashmir" p a.split("Tamilnadu") 然后输出是 ["",

我有一根绳子

a="Tamilnadu is far away from Kashmir"
如果我使用“Tamilnadu”拆分这个字符串,那么我没有发现Tamilnadu是数组的一部分,我在那里找到空字符串,如果我拆分字符串“away”,那么away在结果数组中不存在,它在away的位置有空字符串。我应该做什么来包含它,而不是使用空字符串

范例

a="Tamilnadu is far away from Kashmir"

p a.split("Tamilnadu")
然后输出是

["", " is far away from Kashmir"]
但是我想要

["Tamilnadu", " is far away from Kashmir"]
从文档:

如果模式是一个
Regexp
str
在模式匹配的地方被分割。每当模式匹配长度为零的字符串时,
str
被拆分为单个字符。如果模式包含组,那么相应的匹配项也将在数组中返回

所以。。。要按
“泰米尔纳德邦”
分割并将其保留在列表中,请将其设为捕获组:

"Tamilnadu is far away from Kashmir".split(/(Tamilnadu)/)
# => ["", "Tamilnadu", " is far away from Kashmir"]
或者,如果您想在“泰米尔纳都”之后分割,请使用lookback在其之后进行零宽度匹配:

"Tamilnadu is far away from Kashmir".split(/(?<=Tamilnadu)/)
# => ["Tamilnadu", " is far away from Kashmir"]
“泰米尔纳德邦远离克什米尔”。分裂(/(?[“泰米尔纳德邦”,“远离克什米尔”]
来自文档:

如果模式是一个
Regexp
str
在模式匹配的地方被分割。每当模式匹配一个零长度字符串时,
str
被分割为单个字符。如果模式包含组,则相应的匹配项也将在数组中返回

因此…要按
“泰米尔纳德邦”
分割并将其保留在列表中,请将其设为捕获组:

"Tamilnadu is far away from Kashmir".split(/(Tamilnadu)/)
# => ["", "Tamilnadu", " is far away from Kashmir"]
或者,如果您想在“泰米尔纳都”之后分割,请使用lookback在其之后进行零宽度匹配:

"Tamilnadu is far away from Kashmir".split(/(?<=Tamilnadu)/)
# => ["Tamilnadu", " is far away from Kashmir"]
“泰米尔纳德邦远离克什米尔”。分裂(/(?[“泰米尔纳德邦”,“远离克什米尔”]

如果您不知道
“泰米尔纳都”
在字符串中的位置,但希望在字符串前后拆分字符串,并且在生成的数组中没有任何空字符串,则可以使用:

我假设
子字符串在字符串中最多出现一次

正则表达式可以在自由间距模式下编写,以使其能够自我记录:

substring = "Tamilnadu"

/
\A.+                  # match the beginning of the string followed by > 0 characters     
(?=\ #{substring}\b)  # match the value of substring preceded by a space and
                      # followed by a word break, in a positive lookahead
|                     # or
\b#{substring}\b      # match the value of substring with a word break before and after
|                     # or
(?<=\b#{substring}\ ) # match the value of substring preceded by a word break 
                      # and followed by a space, in a positive lookbehind
.+                    # match > 0 characters
/x                    # free-spacing regex definition mode
  #=>
  /
  \A.+                  # ...
  (?=\ Tamilnadu\b)     # ...
  |                     # ...
  \bTamilnadu\b         # ...
  |                     # ...
  (?<=\bTamilnadu\ )    # ...
  .+                    # ...
  /x
substring=“泰米尔纳德邦”
/
\A.+#匹配字符串开头,后跟>0个字符
(?=\\\{substring}\b)\\匹配前面有空格和
#然后是一个单词打断,以积极的方式向前看
|#或
\b#{substring}\b#将子字符串的值与前后的分词符匹配
|#或
(?0个字符)
/x#自由间距正则表达式定义模式
#=>
/
\A.+#。。。
(?=\Tamilnadu\b)#。。。
|                     # ...
\b塔米尔纳杜\b#。。。
|                     # ...

(?如果您不知道
“泰米尔纳都”
在字符串中的位置,但希望在字符串前后拆分该字符串,并且结果数组中没有任何空字符串,则可以使用:

我假设
子字符串在字符串中最多出现一次

正则表达式可以在自由间距模式下编写,以使其能够自我记录:

substring = "Tamilnadu"

/
\A.+                  # match the beginning of the string followed by > 0 characters     
(?=\ #{substring}\b)  # match the value of substring preceded by a space and
                      # followed by a word break, in a positive lookahead
|                     # or
\b#{substring}\b      # match the value of substring with a word break before and after
|                     # or
(?<=\b#{substring}\ ) # match the value of substring preceded by a word break 
                      # and followed by a space, in a positive lookbehind
.+                    # match > 0 characters
/x                    # free-spacing regex definition mode
  #=>
  /
  \A.+                  # ...
  (?=\ Tamilnadu\b)     # ...
  |                     # ...
  \bTamilnadu\b         # ...
  |                     # ...
  (?<=\bTamilnadu\ )    # ...
  .+                    # ...
  /x
substring=“泰米尔纳德邦”
/
\A.+#匹配字符串开头,后跟>0个字符
(?=\\\{substring}\b)\\匹配前面有空格和
#然后是一个单词打断,以积极的方式向前看
|#或
\b#{substring}\b#将子字符串的值与前后的分词符匹配
|#或
(?0个字符)
/x#自由间距正则表达式定义模式
#=>
/
\A.+#。。。
(?=\Tamilnadu\b)#。。。
|                     # ...
\b塔米尔纳杜\b#。。。
|                     # ...

(?如果你想在第一个单词后分开,不管它是什么:
a.split(/\s/,2)#=>[“泰米尔纳德邦”,“远离克什米尔”]
。这使用了的可选第二个参数。@CarySwoveland是的,我知道。事实上,我开始使用它,但我的初始字符串不是一个单词,它是
project=ccc
,所以我想问这个问题,Amadan回答我完全可以。如果你想在第一个单词后拆分,不管它是什么:
a.split(/\s/,2)#=>[“泰米尔纳德邦”,“远离克什米尔”]
。这利用了的可选第二个参数。@CarySwoveland是的,我知道。事实上,我开始使用它,但我的初始字符串不是一个单词,它是
project=ccc
,所以我想问这个问题,Amadan回答我完全可以。
/(?@CarySwoveland OP示例有空格,所以我把它放在那里。
/(?@CarySwoveland OP示例有空格,所以我把它放在那里了。非常感谢。对我来说,棘手的事情是,我想按project=projectname分割字符串,其中projectname是可变的,它接收值,但在正向前瞻或正向前瞻中,我不能传递这样的变量。然而,这不是你问的问题。:-)。我已经编辑了我的答案,以便稍微概括一下。你能写下,
projectname=“xyz”拆分它(“project=xyz什么时候开始?”,“project={projectname}”)->[“什么时候开始”,“project=xyz”,“开始?”]
。是的,我不太清楚。是的,你的编辑对我来说很有用。谢谢谢谢。对我来说,棘手的事情是,我想按project=projectname分割字符串,其中projectname是可变的,它接收值,但在正向前瞻或正向前瞻中,我不能传递这样的变量。然而,这不是你问的问题:-)。我已经编辑了我的答案,以便稍微概括一下。你能写下,
projectname=“xyz”拆分它(“project=xyz什么时候开始?”,“project={projectname}”);=>[“什么时候开始”,“project=xyz”,“开始?”]
。是的,我不太清楚。是的,你的编辑对我有用,谢谢