【发布时间】:2017-02-24 06:41:21
【问题描述】:
Visual Studio/XPath/RegEx:
给定表达式:
(?<TheObject>(Car|Car Blue)) +(?<OldState>.+) +---> +(?<NewState>.+)
给定搜索字符串:
Car Blue Flying ---> Crashed
我预计:
TheObject = "Car Blue"
OldState = "Flying"
NewState = "Crashed"
我得到了什么:
TheObject = "Car"
OldState = "Blue Flying"
NewState = "Crashed"
鉴于新的正则表达式:
(?<TheObject>(Car Blue|Car)) +(?<OldState>.+) +---> +(?<NewState>.+)
结果是(我想要的):
TheObject = "Car Blue"
OldState = "Flying"
NewState = "Crashed"
我从概念上了解幕后发生的事情; RegEx 将它在 OR'd 列表中找到的第一个(从左到右)匹配放入 <TheObject> 组,然后继续。
OR'd 列表是在运行时构建的,不能保证将“Car”或“Car Blue”添加到 <TheObject> 组中的 OR'd 列表中的顺序。 (这是大大简化的 OR'd 列表)
我可以通过将 OR 列表从最长到最短排序来强制它,但是,我正在寻找更优雅的东西。
有没有办法让<TheObject> 组捕获它可以在 OR'd 列表中找到的最大而不是它找到的第一个? (不用我担心订单)
谢谢,
【问题讨论】:
-
非常有趣的问题。我认为您除了按长度排序之外别无选择(反向字母可能更快/更容易?)或者可能像
<Car Blue> Flying ---> Crashed或更确切地说<Noun> <Action> ----> <Result>那样分隔/标记字符串但是是的,您的正则表达式基本上是在说“任何与当前需求、空间以及之后的任何东西相匹配的东西。它做出更长选择的唯一方法是它是否需要Cars或Carpool。或者如果你可以对任何作为占位符的飞行设置一些限制,就像它不能包含空格,但这会导致回溯
标签: regex visual-studio-2010 xpath