【问题标题】:Splitting a string into a pattern of commands将字符串拆分为命令模式
【发布时间】:2017-10-03 20:59:07
【问题描述】:

我需要获取一串串联的关键字命令和数字,并将命令和数字放入列表中。

模式:

{command words} by {number} {command words} by {number} 等等...

输入字符串:

 "turn right by 1 turn left by 99 up by 11 left by 28"

我想我可能会拆分“by”这个词,但这会导致第二组有数字和下一个命令(例如,向左转 1 个)。

正则表达式:

 \sby\s

所需的输出:

 turn right by 1 
 turn left by 99 
 up by 11 
 left by 28

所需列表:

 turn right,turn left,up,left
 1,99,11,28

如何拆分一长串遵循该模式的命令?

文本是一个没有标点符号的大长字符串。 by 这个词后面总是跟一个数字,而且模式是一致的。第一部分可能包含一个或两个关键字命令。

【问题讨论】:

  • 你用什么工具来运行你的正则表达式?
  • @bulbus 你可以用\D简化[^\d]
  • 你也可以使用这个:(\w[\w ]+?)(?=\s*by\s*)\D+\K\d+。它减少了一个捕获组
  • 我能想到的最简单的形式是(\w[\w ]*?)\s*by\s*(\d+)

标签: regex string


【解决方案1】:

简介

您的字符串似乎都具有相同的结构:word or words by 111(一个或多个单词,后跟 by 字面意思,后跟至少一位数字)


代码

See regex in use here

(\w[\w ]*?)\s+by\s+(\d+)

结果

输入

turn right by 1 turn left by 99 up by 11 left by 28

输出

  1. 完整匹配:turn right by 1
    • 第 1 组:turn right
    • 第 2 组:1
  2. 完整匹配:turn left by 99
    • 第 1 组:turn left
    • 第 2 组:99
  3. 完整匹配:up by 11
    • 第 1 组:up
    • 第 2 组:11
  4. 完整匹配:left by 28
    • 第 1 组:left
    • 第 2 组:28

说明

  • (\w[\w ]*?) 将以下内容捕获到捕获组 1
    • \w[\w ]*? 任意单词字符,后跟集合中的任意字符 [\w ](任意单词字符或空格)任意次数,但越少越好
  • \s+by\s+ 一个或多个空格后跟 by 字面意思,后跟一个或多个空格。
  • (\d+) 捕获一个或多个数字到捕获组 2

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2015-08-30
    • 2014-10-14
    • 2011-04-15
    • 2013-04-11
    相关资源
    最近更新 更多