【问题标题】:String Content Compare [closed]字符串内容比较[关闭]
【发布时间】:2016-06-21 04:59:18
【问题描述】:

我需要比较两个字符串的内容,以及两个字符串中是否出现“关键字”。 以下是两个示例(等量部分以粗体突出显示):

FUTURE EURO BUND 03.16 CALL 03.16 BP 159,50 EUREX

ETD CALL 3 月 16 日 ERX EURO BUND159.50

关键字是 PUT 和 CALL 之类的词,数字可以用逗号或点分隔。 与 3 月 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 也可以。

你会走哪条路?我需要比较数百个字符串,并需要制作一个建议列表,第一个列表中的哪些字符串最适合第二个列表中的字符串。

【问题讨论】:

  • 哇,我们怎么知道 03.16 是日期还是数字?
  • 正如我所说的那样会很棒,但这部分不会那么重要。其他关键字会更重要。
  • 很明显,您需要识别所有可能的格式(考虑您不感兴趣的部分,最精确、最好的),并将您的模式构建为这些不同格式的交替。完成这项工作后,您可以尝试分解模式以获得更快的结果。否则,就无法区分日期和金额。

标签: c# regex vb.net string


【解决方案1】:

只是为了好玩

^(?=.*?((?: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`

例如:16 年 2 月 29 日

|(?<day_type4>\d+\s\w{3}\s\d{2})

说明:
|
(?&lt;day_type4&gt;组名day_type4
\d+\s\w{3}\s\d{2}日格式
\d数字
\s空白
@987654334 @3个字母单词

【讨论】:

  • 这是一些简洁的正则表达式!
  • @Tim007 这是一个非常有趣的正则表达式!如果在一个字符串中是像 19 OCT 13 或 29 FEB 16 的日期,而在另一个字符串中它反映为 19.10.13 或 13.02.16,您将如何扩展它。现在我需要找出如何将所有正则表达式匹配提取到一个列表中,我可以将其与第二个字符串进行比较。
  • @Athu : 检查更新,像这样添加|(?&lt;day_type_n&gt;***CODE HERE***) 以扩展它。
【解决方案2】:

您的帖子过于宽泛并且包含太多问题,因此只会解决最重要的(根据您的定义),即:在 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"))

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    也许你应该尝试这些方面的东西?这将为您提供什么,您现在可以研究如何解析日期和数字以统一其表示的规则。

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

    结果:

    打电话
    欧元

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多