【问题标题】:How do I replace words that contain no letters at the beginning of my string?如何替换字符串开头不包含字母的单词?
【发布时间】:2017-10-07 14:42:50
【问题描述】:

我使用的是 Ruby 2.4。我想替换字符串开头不包含任何字母的单词。 “单词”是由空格(或行首或行尾)包围的任何字符序列。比如这个字符串

   123  255 abc

会变成

abc

这个字符串

1556  2a2  ccc

会变成

2a2 ccc

我试过了

string.gsub(/\A[[:space:]]*[^\p{L}]+/, '')

但这并没有完成。如何替换字符串开头不包含字母的所有单词?

【问题讨论】:

  • 你的问题措辞不当。在 Ruby 中,“单词”是一个包含 工作字符(字母、数字和下划线)的字符串。因此,“不包含字母的单词”是下划线字符串,我确定这不是你的意思。而不是“word”使用,说,“substring”。
  • 什么是“无字母无”?

标签: ruby regex string


【解决方案1】:

您可能需要单词边界 (\b) 和锚点(而不是 \A)。
这按预期工作:

^[[:space:]]*[^\p{L}]+\b

a demo on rubular.com


正如@Cary 在 cmets 中所指出的,您甚至可以将表达式简化为 \A[^\p{L}]+\(或者:^[^\p{L}]+\ 每行开始)。

【讨论】:

  • @Cary 将^[^p{L}]+ will transform 123 25a5` 改进为a5。这是错误。任何正确的基于正则表达式的答案都必须匹配第一个正确子字符串开头的单词边界,或者不正确和正确子字符串之间的空格。你和我的回答都符合。
  • @MarcLambrichs:不,问题不在于表达式本身,而在于使 最后的空格 不可见,请参阅rubular.com/r/SX9JLItjWN 以了解他的实际表达式。跨度>
【解决方案2】:

这将:

string.gsub(/^[^a-zA-Z]+\s/, '')

或者(如果你想匹配 unicode 字符):

string.gsub(/^[^\p{L}]+\s/, '')

查看rubular

【讨论】:

    【解决方案3】:

    您可以使用.split 将字符串拆分为单词,并使用drop_while 过滤正则表达式中的第一个单词:

    > '   123  255 abc'.split().drop_while { |e| e=~/^\d+$/ }.join(' ')
    => "abc"
    > '1556  2a2  ccc'.split().drop_while { |e| e=~/^\d+$/ }.join(' ')
    => "2a2 ccc"
    

    【讨论】:

      猜你喜欢
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2015-10-08
      • 2020-08-19
      • 2021-06-30
      • 2016-12-05
      相关资源
      最近更新 更多