我需要比较两个字符串的内容以及"关键字"发生在两个字符串中。 以下是两个示例(等号以粗体突出显示):
未来 EURO BUND 03.16 CALL 03.16 BP 159,50 EUREX
ETD CALL MAR 16 ERX EURO BUND 159.50
关键字是像PUT和CALL这样的词,Numbers可以是逗号或点分隔。 与MAR 16相比,03.16日期很好,但是关键字的出现是未知的。还有类似规则的东西,如果某些字符串存在于一个字符串中,例如" CALL",那么" PUT"第二个字符串中不允许使用。
具有不同日期样式的另一个示例:
EQOI购买 PUT 2.5 ACI US 15/01/16 000043XI
PUT Arch Coal Inc. 15.01.16 BP 2,50 OTC
我正在考虑用空格分割字符串并逐个比较内容,但是我会错过BUND 159.50 中的数字,如果它包含,我需要检查分割的字符串数字/数字日期等。我可以使用任何现有的库来进行这种比较吗?
优先使用VB.NET,Linq但C#或Regex也可以。
你会走哪条路?我需要比较数百个字符串,并且需要提出一个提案列表,第一个List中的哪个字符串最适合第二个列表的字符串。
答案 0 :(得分:2)
只是为了好玩
^(?=.*?((?:CALL)|(?:PUT))).*?(?<day_type1>\d+.\d+.?\d+).*?(?<num_type1>\d+,\d+)|^(?=.*?((?:CALL)|(?:PUT))).*?(?<day_type2>\w{3}\s\d{2}).*?(?<num_type2>\d+.\d+)|^(?=.*?((?:CALL)|(?:PUT))).*?(?<num_type3>\d+.\d+).*?(?<day_type3>\d+\/\d+\/\d+)
输出:
MATCH 1
1. [23-27] `CALL`
day_type1 [17-22] `03.16`
num_type1 [37-43] `159,50`
MATCH 2
4. [55-59] `CALL`
day_type2 [60-66] `MAR 16`
num_type2 [80-86] `159.50`
MATCH 3
7. [97-100] `PUT`
num_type3 [101-104] `2.5`
day_type3 [112-120] `15/01/16`
MATCH 4
1. [131-134] `PUT`
day_type1 [150-158] `15.01.16`
num_type1 [162-166] `2,50`
添加了更多日期格式:
^(?=.*?((?:CALL)|(?:PUT)))(?=.*?\s(?<day>(?<day_type1>\d+[.\/]\d+[.\/]?\d+)|(?<day_type2>\w{3}\s\d{2})|(?<day_type3>\d+\/\d+\/\d+)|(?<day_type4>\d+\s\w{3}\s\d{2})))(?=.*\s[a-zA-Z]*(?<num>(?<num_type1>\d+,\d+)|(?<num_type2>\d+\.\d+)|(?:(?<num_type3>\d+\.\d+))))
输出:
MATCH 1
1. [23-27] `CALL`
day [17-22] `03.16`
day_type1 [17-22] `03.16`
num [37-43] `159,50`
num_type1 [37-43] `159,50`
MATCH 2
1. [55-59] `CALL`
day [60-66] `MAR 16`
day_type2 [60-66] `MAR 16`
num [80-86] `159.50`
num_type2 [80-86] `159.50`
MATCH 3
1. [97-100] `PUT`
day [112-120] `15/01/16`
day_type1 [112-120] `15/01/16`
num [101-104] `2.5`
num_type2 [101-104] `2.5`
MATCH 4
1. [131-134] `PUT`
day [150-158] `15.01.16`
day_type1 [150-158] `15.01.16`
num [162-166] `2,50`
num_type1 [162-166] `2,50`
MATCH 5
1. [172-175] `PUT`
day [191-199] `9 OCT 13`
day_type4 [191-199] `9 OCT 13`
num [203-207] `2,50`
num_type1 [203-207] `2,50`
MATCH 6
1. [213-216] `PUT`
day [232-241] `29 FEB 16`
day_type4 [232-241] `29 FEB 16`
num [245-249] `2,50`
num_type1 [245-249] `2,50`
Ex:29 FEB 16
|(?<day_type4>\d+\s\w{3}\s\d{2})
说明:
|
或
(?<day_type4>
群组名称day_type4
\d+\s\w{3}\s\d{2}
天格式
\d
号码
\s
空白
\w{3}
3个字母字
答案 1 :(得分:1)
您的帖子过于宽泛且包含太多问题,因此只会解决最重要的问题(根据您的定义),即:在2个字符串中找到关键字“PUT”和“CALL”并应用某些逻辑条件。假设您有以下示例字符串:
string str1 ="FUTURE EURO BUND 03.16 CALL 03.16 BP 159,50 EUREX"
string str2 ="ETD CALL MAR 16 ERX EURO BUND159.50"
然后检查关键字可以通过C#String.Contains()方法执行,每个定义添加逻辑操作(如果第一个字符串包含“PUT”,则第二个字符串不能包含“CALL”):
if(str1.Contains("PUT") && !str2.Contains("CALL"))
希望这可能会有所帮助。
答案 2 :(得分:1)
可能你应该沿着这些方向尝试一下吗?这将给你带来什么,你现在可以处理如何解析日期和数字以统一其表示的规则。
dim s1 as string= "FUTURE EURO BUND 03.16 CALL 03.16 BP 159,50 EUREX"
dim s2 as string = "ETD CALL MAR 16 ERX EURO BUND159.50"
dim whiteList as new List(Of String)(New String() {"CALL", "EURO"})
dim l1 as List(of String) =
s1.Split(" ".toCharArray(), StringSplitOptions.RemoveEmptyEntries).
Where(function(s) whiteList.Contains(s)).ToList()
dim l2 as List(of String) =
s2.Split(" ".toCharArray(), stringSplitOptions.RemoveEmptyEntries).
Where(function(s) whiteList.Contains(s)).ToList()
dim result = l2.Intersect(l1).ToList()
result.ForEach(sub(s) Console.WriteLine(s))
结果:
CALL
EURO