字符串内容比较

时间:2016-03-07 15:12:47

标签: c# regex vb.net string

我需要比较两个字符串的内容以及"关键字"发生在两个字符串中。 以下是两个示例(等号以粗体突出显示):

未来 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中的哪个字符串最适合第二个列表的字符串。

3 个答案:

答案 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+)

Regex Demo

输出:

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+))))

Regex Demo

输出:

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