【问题标题】:Regex Skip space in match正则表达式在匹配中跳过空格
【发布时间】:2015-10-18 15:44:18
【问题描述】:

我有一串代表 3 种不同长度的数字。我需要在字符串中挑选出第二个长度,但无法从匹配中排除空格。这是字符串的示例。它总是在点之后但在它变化之前有 6 位数字。在这种情况下,我需要完全匹配 907.086614

1417.322835 907.086614 2.267717

^\s(\d+\.\d{6})

我玩过不同的外观,但无法排除空白。

【问题讨论】:

  • 感谢所有建议,我现在的问题是,当我在需要此正则表达式的应用程序中尝试此操作时,它不支持积极的后向和积极的前瞻。 Bummer :-( 那么有没有其他方法可以在没有积极的观察的情况下工作?
  • 在我的回答中使用第二种模式。如果有效,请告诉我

标签: regex


【解决方案1】:

\s 的一个潜在副作用是它匹配回车符。

Example mistaken match

由于您要查找一组浮点数的第二列,因此最好明确:

\d[ \t](\d+\.\d+)[ \t]\d

^                          trailing digit from first col
   ^                       a single space or tab
         ^  ^ ^            capture float
                   ^       single space or tab
                       ^   leading digit of third col

Demo

您还可以将捕获置于前瞻和后视之间:

(?<=\d[ \t])(\d+\.\d+)(?=[ \t]\d)

Demo

【讨论】:

    【解决方案2】:

    你可以试试这个

    (?&lt;=\s)(\d+\.\d{6})(?=\s)

    demo

    但如果您仍想使用您的模式,请删除行锚^ 的开头并匹配group 1

    \s(\d+\.\d{6})

    demo

    【讨论】:

    • 感谢 James Jelo4kul,第二种模式在其他应用程序中使用时有效。我怀疑它是否会因为前面的空格也被选中,但显然它在另一个应用程序中被忽略了。可能是因为该值被其他应用程序视为长度值。
    【解决方案3】:

    后面有正面的样子怎么样:

    (?<=\s)(\d+\.\d{6})
    

    Online Demo

    (?&lt;=\s) Positive Lookbehind - 断言下面的正则表达式可以匹配\s

    【讨论】:

    • 是的,我已经尝试过了,但它也会选择最后一部分,我得到两个匹配项。 1. 907.086614 2. 2.267717 我只想要第一部分。
    • 那是因为你使用了一个全局修饰符,而它似乎不适用于你的正则表达式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2010-10-08
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多