C# 有条件地忽略最后一个词

C# 有条件地忽略最后一个词,c#,regex,C#,Regex,有人能帮忙吗?也发布在RegexBuddy论坛上 我在底部完整列出了这个相对较大的自动生成正则表达式,并且有许多重复的片段使用这个片段:- # Add words to word list (?<_KC1>(?:(?:\w|[ \t\\/]|\[\w*\])*?)) 这是为了在更为知名的片段之间“收集”单词和文本。这些捕获都在稍后的代码中聚合,以提供整个匹配中的单词列表 我遇到的问题是第一个备选部分,即: # Pair of Strike prices (?<

有人能帮忙吗?也发布在RegexBuddy论坛上

我在底部完整列出了这个相对较大的自动生成正则表达式,并且有许多重复的片段使用这个片段:-

# Add words to word list
(?<_KC1>(?:(?:\w|[ \t\\/]|\[\w*\])*?))
这是为了在更为知名的片段之间“收集”单词和文本。这些捕获都在稍后的代码中聚合,以提供整个匹配中的单词列表

我遇到的问题是第一个备选部分,即:

    # Pair of Strike prices
    (?<Strike>[+|-]?\d+(?:\.\d+)?)/(?<Strike2>[+|-]?\d+(?:\.\d+)?)

    # Add to Word List (but not 'x' as last word) !!!!!!!!!!!! This is what needs changing
    (?<_KC3>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

    # Cross price
    (?:x[ \t]?-?(?<Cross>[+|-]?\d+(?:\.\d+)?)x?)?
正如你所看到的,交叉价格总是以“x”开头,所以我需要的是一个尽可能类似于我提到的第一个片段的模式,但如果它恰好是“x”,则忽略最后一个单词。 还有两个问题: 1交叉价格本身是可选的 2“x”本身可以匹配期货到期日作为路透社日期代码

我尝试过消极的落后等等,但不管我做什么,我都会把其他事情搞砸。我相信答案可能在于If-Then-Else条件,但我不确定

例如:-

WTI AMERICAN:Jun12 110.00/140.00[1x2]通话间隔x 102.50 350-365

这对执行价按预期返回110.00/140.00

但是单词列表正在提取[1x2]呼叫扩展x 本应为交叉价格的102.50现在在表达式的后面部分匹配,作为投标/报价价差的投标部分

在这方面得到的任何帮助都是感激的

干杯 西蒙


如果您要从文件或其他内容读取数据,最好使用awk之类的工具进行解析。不要使用复杂的正则表达式程序,因为它们可能会在一些不太预期的场景中导致问题。
干杯

如果要读取文件或其他内容,最好使用awk之类的工具进行解析。不要使用复杂的正则表达式程序,因为它们可能会在一些不太预期的场景中导致问题。
干杯

使用正则表达式解决问题的短语是什么:现在你有两个问题了?我不相信这个问题可以用任何其他方法解决。如果你能想出任何其他的解决方案,那么我洗耳恭听。关于使用正则表达式解决问题的短语是什么:现在你有两个问题?我不相信这个问题可以用任何其他方式解决。如果你能想出任何其他的解决方案,那么我洗耳恭听。谢谢,但是模式匹配是解决这个问题的正确方法。只是我不知道正则表达式中的几个字符能满足我的需要。如果你这么肯定,那没问题。但是如果你确定你的输入方式,那么请去探索像awk这样的工具。他们将在一两行内解决您的问题。谢谢,但模式匹配是解决此问题的正确方法。只是我不知道正则表达式中的几个字符能满足我的需要。如果你这么肯定,那没问题。但是如果你确定你的输入方式,那么请去探索像awk这样的工具。他们会在一两分钟内解决你的问题。
# Match this group (optional)
(?:

    # Match one of the product symbols or their aliases
    \b(?<ProductSymbol>CL|Brent|GasOil|WTI|LO|BRT)\b

    # Add words to word list
    (?<_KC1>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

    # Skip over whitespace plus any of these characters [:]
    [ \t:]+
)?

# Futures expiry date
(?<=[ \t]|'|^)(?<FuturesExpiryPeriod>(?<_MY>(?<_MYP>(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))[ \t]?(?<_MYY>(?:20)?\d\d))|(?<_CE>Cal-?(?<_CEY>(?:20)?\d\d))|(?<_QF>Q(?:uarter)?(?<_QFP>1|2|3|4)[ \t]*(?<_QFY>(?:20)?\d\d))|(?<_QL>(?<_QLP>1|2|3|4)[ \t]*Q(?:uarter)?[ \t]*(?<_QLY>(?:20)?\d\d))|(?<_HY>(?<_HYP>1|2)[ \t]*H(?:alf)?[ \t]*(?<_HYY>(?:20)?\d\d))|(?<_ER>(?<_ERP>[FGHJKMNQUVXZ])(?<_ERY>\d{0,2}))[ \t]*)

# Skip over whitespace
[ \t]+

# Add words to word list
(?<_KC2>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

# Match one of the following choices (in order):
(?:
    (?: # First choice

        # Pair of Strike prices
        (?<Strike>[+|-]?\d+(?:\.\d+)?)/(?<Strike2>[+|-]?\d+(?:\.\d+)?)

        # Add to Word List (but not 'x' as last word) !!!!!!!!!!!! This is what needs changing
        (?<_KC3>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

        # Cross price
        (?:x[ \t]?-?(?<Cross>[+|-]?\d+(?:\.\d+)?)x?)?
    )
    |
    (?: # Second choice

        # Cross price
        (?:x[ \t]?-?(?<Cross>[+|-]?\d+(?:\.\d+)?)x?)

        # Add words to word list
        (?<_KC4>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

        # Pair of Strike prices
        (?<Strike>[+|-]?\d+(?:\.\d+)?)/(?<Strike2>[+|-]?\d+(?:\.\d+)?)?
    )
    |
    (?: # Third choice

        # Single Strike price
        (?<Strike>[+|-]?\d+(?:\.\d+)?)

        # Add to Word List (but not 'x' as last word) !!!!!!!!!!!! This is what needs changing
        (?<_KC5>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

        # Cross price
        (?:x[ \t]?-?(?<Cross>[+|-]?\d+(?:\.\d+)?)x?)?
    )
    |
    (?: # Fourth choice

        # Cross price
        (?:x[ \t]?-?(?<Cross>[+|-]?\d+(?:\.\d+)?)x?)

        # Add words to word list
        (?<_KC6>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

        # Single Strike price
        (?<Strike>[+|-]?\d+(?:\.\d+)?)?
    )
)

# Add words to word list
(?<_KC7>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

# Skip over whitespace plus any of these characters [,]
[ \t,]+

# Bid/Offer spread
(?<Bid>[+|-]?\d+(?:\.\d+)?)[ \t]*(?:/|-|\ )[ \t]*(?<Offer>[+|-]?\d+(?:\.\d+)?)

# Look for any other keywords in brackets (optional)
(?:

    # Skip over whitespace
    [ \t]*

    # <pattern>
    \(

    # Add words to word list
    (?<_KC8>(?:(?:\w|[ \t\\/]|\[\w*\])*?))

    # <pattern>
    \)
)?