【问题标题】:Multiline regex to match string after space-separated data多行正则表达式以匹配空格分隔数据后的字符串
【发布时间】:2017-05-29 14:59:30
【问题描述】:

我的目标是使用正则表达式实现多行 unicode-aware 字符串清理。

我从这个没有后视限制的正则表达式开始:

(?<=[[:blank:]]).*

然后,我找到了限制后向的方法,如下所示:

(?!.{20,})(?<=[[:blank:]]).*

它适用于某些情况,但不是很稳定(link),因为字符串长度不可预测。

尾逗号也是不可取的,但我还没有弄清楚如何用正则表达式删除它,因为它是不可预测的方式(参见测试用例)。

如何为此任务创建适当有限的后视?我正在使用 boost(pcre) 风格的正则表达式。

测试用例:

РПÑАВÂРßÛÑ ÛÑРВßР ÛÑÛÑАÑÛ, 11.22 Ø.Á.
ÛÑРВЛÛÑВ ÛÑßВßДÛÑВßЛ РИÐРÛПÑÑВÛ 11.22 Ã.Ö
ВßÑÛВÂЛÛÑВ ÛÑВÂÛÑВЛß ßРßÂРÑВЛРÛÐßРВ, 11.22 Â.Ö.
ÛÑВÛÑВ ÛßÛßРÑВßРÐ ßТАÛ, 11.22 Ã.Ö.
РÐÑАВПРßÛÑ ÛÑРВßР ÛÑÛÑАÑÛ, 11.22 Ø.р.
ÛÑРВÂÛÑВ ÛÑßВßДÛÑВß РÂПРÛПÑÑВÛ 11.22 Ø.Á.
ВßÑÛВДЛÛÑВ ÛÑВЛÛÑВЛß ßРßЛРÑВЛРÛЛßРВ 11.22 Ø.Ö.
ÛÑВÛÑВ ÛßÛßРÑВßРÐ ßТАÛ, 11.22 Ï.Á.

出来

РПÑАВÂРßÛÑ ÛÑРВßР ÛÑÛÑАÑÛ
ÛÑРВЛÛÑВ ÛÑßВßДÛÑВßЛ РИÐРÛПÑÑВÛ
ВßÑÛВÂЛÛÑВ ÛÑВÂÛÑВЛß ßРßÂРÑВЛРÛÐßРВ
ÛÑВÛÑВ ÛßÛßРÑВßРÐ ßТАÛ
РÐÑАВПРßÛÑ ÛÑРВßР ÛÑÛÑАÑÛ
ÛÑРВÂÛÑВ ÛÑßВßДÛÑВß РÂПРÛПÑÑВÛ
ВßÑÛВДЛÛÑВ ÛÑВЛÛÑВЛß ßРßЛРÑВЛРÛЛßРВ
ÛÑВÛÑВ ÛßÛßРÑВßРÐ ßТАÛ

【问题讨论】:

    标签: regex pcre lookbehind


    【解决方案1】:

    你也可以匹配那些不需要的部分:

    \s*[,\d].*
    

    然后在您的环境中用任何内容替换它们(或删除它们)。

    Live demo

    【讨论】:

      【解决方案2】:

      根据示例输出,我认为您需要提取任何 Unicode 序列,但不能提取拉丁字母 (\p{L}) 或空格 (\s) 从行首到第一个字符不属于此类:

      ^[\p{L}\s]+
      

      演示:https://regex101.com/r/4rFuCC/1

      【讨论】:

      • 抱歉,npp 无法与此正则表达式匹配任何内容并进行了测试
      • 哦,Notepadd++ 与众不同。它支持 PCRE,但方式有限。特别是,它不支持 Unicode 类别,包括 L - 请参阅 cmets 到 \Pshort name,\P{name] here。使用 NPP,您可以使用 \w 来匹配包括 Unicode 在内的字母数字。所以正则表达式可以重写为^(?:(?!\d)[\w\s])+
      • 抱歉,这个正则表达式也不起作用。由于^,它会尝试从头开始匹配。
      • 从每一行的开头。在我的测试中,它返回 РПÑАВÂРßÛÑ ÛÑРВßР ÛÑÛÑАÑÛÛÑРВЛÛÑВ ÛÑßВßДÛÑВßЛ РИÐРÛПÑÑВÛ 等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多