2016-03-07 2 views
1

Мне нужно сравнить содержимое двух строк и, если в обеих строках встречаются «ключевые слова». Вот два примера (Равные части выделены жирным шрифтом):String Content Compare

БУДУЩИЕ EURO БУНД 03,16 ВЫЗОВ 03,16 ВР 159,50 EUREX

ETD ВЫЗОВ 16 марта ERX EURO БУНД 159.50

Ключевые слова являются словами PUT и CALL, цифры могут быть разделены запятыми или точками. Дата 03.16 была бы полезна для сравнения с MAR 16, но появление ключевых слов неизвестно. Существует также что-то вроде правила, если определенные ключевые слова существуют в одной строке, такой как «CALL», тогда «PUT» не разрешается во второй строке.

Другой пример с различными стилями Дата:

EQOI КУПИТЬ PUT2.5 ACI США 15/01/16 000043XI

PUT Arch Coal Inc. 15.01.16 ВР 2,50 OTC

Я думал о сплите ting строки с помощью Space и сравнения содержимого один за другим, но затем я пропустил бы номер в BUND 159.50. Мне нужно было бы проверить расщепленную строку, если она содержит даты числа/числа и т. д. Существуют ли какие-либо существующие библиотеки, которые я мог бы использовать для такого типа сравнения?

Предпочтительные VB.NET, Linq, но C# или Regex, также в порядке.

В каком направлении вы бы поехали? Мне нужно сравнить сотни строк и создать список предложений, который из строк в первом списке лучше всего подходит для строк второго списка.

+1

Ого, как мы должны знать, 03,16 является дата или номер? –

+0

Как я уже сказал, это будет здорово, но эта часть не будет столь важна. другие ключевые слова были бы более важными. – Athu

+4

Очевидно, что вам нужно идентифицировать все возможные форматы (принимая во внимание, что ваши части тоже не заинтересованы, самые точные, лучшие) и построить ваш шаблон как чередование этих разных форматов. Как только эта работа будет выполнена, вы можете попытаться разложить свой шаблон на более быстрые результаты. В противном случае невозможно отличить дату от суммы. –

ответ

1

Ваше сообщение слишком широкое и содержит слишком много вопросов, поэтому будет рассмотрено только самое важное (по вашему определению), а именно: найти ключевые слова «PUT» и «CALL» в 2 строках и применить некоторые логические условия. Если предположить, что у вас есть следующие образцы строки:

метода
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() W/логических операций, добавленных за вами определение (если первая строка содержит «PUT», а затем второй не может содержать «CALL»):

Надеюсь, это поможет.

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` 

Пример: 29 февраля 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 буквы слова

+0

Это немного опрятное регулярное выражение! – Mych

+0

@ Tim007 Это очень интересное Regex! Как бы вы расширили его, если в одной строке находится Date, например, 19 OCT 13 или 29 FEB 16, а в другой строке - 19.10.13 или 13.02.16. Теперь мне нужно выяснить, как извлечь все соответствия регулярных выражений в список, который можно сравнить со второй строкой. – Athu

+0

@Athu: проверьте обновление, добавьте вот этот '| (? *** КОД ЗДЕСЬ ***)' для его расширения. –

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

Результат:

ВЫЗОВ
EURO