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