【问题标题】:Regular Expressions with lookahead in RubyRuby 中具有前瞻功能的正则表达式
【发布时间】:2012-04-19 22:02:04
【问题描述】:

我当前的正则表达式战斗是替换字符串中数字前的所有逗号。然后,正则表达式必须忽略所有以下逗号。我已经在 rubular 上搞砸了大约一个小时,但似乎无法正常工作。

测试字符串...

'this is, a , sentence33 Here, is another.'

所需的输出...

'this is comma a comma sentence33 Here, is another.'

所以有些类似...

testString.gsub(/\,*\d\d/,"comma")

为了给你一些背景知识,我正在做一个小项目。我收集的元素主要以逗号分隔,以两位数的年龄开头。然而,有时在可能包含逗号的年龄之前有一个标题。为了保留我稍后设置的结构,我需要替换标题中的逗号。

在尝试堆栈溢出的答案之后......

我仍然有一些问题。不要笑,但这是导致问题的屏幕抓取的实际线......

statsString =     "              23,  5'9\",  140lb,  29w,                        Slim,                 Brown       Hair,             Shaved Body,              White,    Looking for       Friendship,    1-on-1 Sex,    Relationship.   Out      Yes,SmokeNo,DrinkNo,DrugsNo,ZodiacCancer.      Versatile,                  7.5\"                    Cut, Safe Sex Only,     HIV      Negative, Prefer meeting at:Public Place.                   PerformerContact  xxxxxx87                                                   This user has TURNED OFF his IM                                     Send Smile      Write xxxxxx87 a message:" 

首先,我在所有这些片段中添加“xx,”,以便我的逗号过滤适用于所有情况,无论是否有超前文本。其次是实际修复。输出如下...

statsString = 'xx, ' + statsString

statsString = statsString.gsub(/\,(?=.*\d)/, 'comma');

 => "xxcomma               23comma  5'9\"comma  140lbcomma  29wcomma                        Slimcomma                 Brown       Haircomma             Shaved Bodycomma              Whitecomma    Looking for       Friendshipcomma    1-on-1 Sexcomma    Relationship.   Out      YescommaSmokeNocommaDrinkNocommaDrugsNocommaZodiacCancer.      Versatilecomma                  7.5\"                    Cutcomma Safe Sex Onlycomma     HIV      Negativecomma Prefer meeting at:Public Place.                   PerformerContact  xxxxx87                                                   This user has TURNED OFF his IM                                     Send Smile      Write xxxxxxx87 a message:" 

【问题讨论】:

  • 为什么Here后面的逗号没有被替换?因为Here 以大写字母开头?您需要提供有关您的要求的更多详细信息。也许还有更多输入和所需输出的示例。您说“在数字前替换逗号”,但这不是您的示例所做的。
  • 在单个正则表达式中执行此操作似乎注定要失败;这是一个必须以这种方式解决的家庭作业问题,还是您只是试图解决问题并陷入认为正则表达式是解决问题的最佳方法?
  • 刚刚在问题中添加了一些背景信息。感谢您的反馈。
  • @alan - 因为逗号后面没有数字/数字。

标签: ruby regex ruby-1.9.2 regex-lookarounds


【解决方案1】:

代码:

testString = 'this is, a , sentence33 Here, is another.';
result = testString.gsub(/\,(?=.*\d)/, 'comma');
print result;

输出:

this iscomma a comma sentence33 Here, is another.

测试:

http://ideone.com/9nt1b

【讨论】:

  • 如果您确定该数字是(至少)2 位数字,那么您可以在正则表达式中将 \d 替换为 \d\d。但是对于\d,它会按照您在问题中的要求进行操作,无论该号码有多少位数。
  • 非常感谢。那成功了。现在唯一的问题是一些条件逻辑。当两位数字之前的标题不存在时,正则表达式会混淆我需要downsetram的所有逗号。我可以试试 testString.gsub(/^\,(?=.*\d)/, 'comma');或类似的东西
  • 我不明白您的意思,您能否为此发布一个新问题并在此处使用该问题的链接发表评论?请提供尽可能多的详细信息以了解您的问题。
  • 实际上这段代码并没有我最初想象的那么有用。当我在 irb 中运行上面的行时,它们确实会产生指示的输出,但是在我的脚本中,它们会将所有 , 转换为“逗号”。我在上面添加代码
  • @user1306973 - 因为在这样的逗号之后总是有一些数字(甚至很远)。如果这不是您想要的,那么您的问题是不正确的,因为我的答案是解决您所要求的代码的代码......
【解决方案2】:

不是那么短,但是,似乎可以解决您的任务:

str = 'this is, a , sentence33 Here, is another.'

str = str.match(/(.*)(\d+.*)/) do

    before = $1
    tail = $2

    before.gsub( /,/, 'comma' ) + tail
end

print str

【讨论】:

  • 谢谢你,Vache。我是 stackoverflow 的新手。
  • 要检查 something 是否跟随比赛,您需要使用(?=X),其中X 应该跟随比赛 - 所以在这种情况下,它是任何东西或没有 .* 和数字 \d,然后是 (?=.*\d),欢迎来到 Stackoverflow。
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多