【问题标题】:Regex on multiple lines of random order多行随机顺序的正则表达式
【发布时间】:2016-01-19 11:11:26
【问题描述】:

我正在使用 BIRT 设计基于数据库的报表,并且表单的其中一个字段包含多行,如下所示:

网站:放置 ThePlace

房间:D2 RMD3

InstanceId:OI-RandomChars

事实上,它们并不总是按此顺序排列,因为它是用户输入(以另一种形式,而不是 BIRT 提示符)。 请注意,这些字段包含大写字母。

所以我想做的是在三个单独的列中提取,因此在 JavaScript 中使用三个正则表达式分别是 Site、Room 和 InstanceId。 我已经尝试了很多事情,比如捕捉每一行直到行尾或在各种条件下播放子字符串......到目前为止,我认为最好的办法是使用字符串函数替换来删除任何与我想要的不同的东西抓住。 行 Room 的一个示例是:

row["Log"].replace(/?![Room:\s\S*\s]/, "")

我收到一个错误,但你可以看到我尝试做什么。

感谢您对我的问题的所有考虑。

【问题讨论】:

  • 你可以 row["Log"].split("\n") 然后测试看看哪个数组项有 Room/Site/等。

标签: javascript regex birt


【解决方案1】:

单个正则表达式可能会变得过于复杂,难以阅读和维护此类工作。

我可能会考虑像您的第一直觉那样以编程方式进行。

首先我会考虑将字符串分成几行

var lines = string.split("\n\n");

这会将你所有的双线分割成一个数组

["Site: Place ThePlace", "Room: D2 RMD3", "InstanceId: OI-RandomChars"]

然后循环遍历所有线路,然后进行检查。 如果您愿意,您现在的检查实际上可以是正则表达式,也可以使用子字符串。

这是一个例子:

var site, room, InstanceId;
var siteCheckRegex = new Regex("^Site:");

for(var i=0; i<lines.length; i++){

      if(siteCheckRegex.test(lines[i])){
        site = lines[i].replace("Site:","");
      }

      [...]
}

这实际上取决于您真正想从中得到什么,以及您可以在用户输入数据中发现的问题和差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多