2013-08-26 13 views
7

muszę przeanalizować plik EDI, gdzie Separatory są +, : i ' znaki i postać ucieczka (release) jest ?. najpierw podzielony na segmentypodzielonego regex ciąg z użyciem znaku uwalniania i separatory

var data = "NAD+UC+ABC2378::92++XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 71+Duzce+Seferihisar/IZMIR++35460+TR" 

var segments = data.Split('\''); 

wtedy każdy segment jest podzielony na elementy danych segmentu przez +, następnie elementy danych segmentu są podzielone na elementy składowe danych poprzez :.

var dataElements = segments[0].Split('+'); 

Powyższy przykładowy ciąg znaków nie jest poprawnie przetwarzany ze względu na użycie znaku zwolnienia. Mam specjalny kod do czynienia z tym, ale myślę, że powinno to być wszystko wykonalne przy użyciu

Regex.Split(data, separator); 

nie jestem zaznajomiony z Regex'es i nie mógł znaleźć sposób, aby to zrobić do tej pory. Najlepszym wymyśliłem tak daleko jest

string[] lines = Regex.Split(data, @"[^?]\+"); 

który pomija znak przed + znak.

NA 
U 
ABC2378::9 
+XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 7 
Duzc 
Seferihisar/IZMI 
+3546 
TR 

Prawidłowy wynik powinien być:

NAD 
UC 
ABC2378::92 

XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 7 
Duzce 
Seferihisar/IZMIR 
35460 
TR 

Więc pytanie jest to wykonalne z Regex.Split, a co powinno separator regex wyglądać.

+0

w twojej przykładowe dane Nie widzę żadnych "", więc w jaki sposób je rozdzielasz? –

+0

Nie chciałem dołączać całego pliku, więc dane przykładowe to tylko jeden wiersz z tych segmentów, które są już analizowane. – hazimdikenli

+0

OK. Więc chcesz podzielić, gdzie jest '+' nie poprzedzony znakiem '?', Prawda? –

Odpowiedz

3

widzę, że chcesz podzielić się wokół znaki plus + tylko wtedy, gdy nie są one poprzedzone (uciekł) znakiem zapytania ?. Można to zrobić przy użyciu następujących:

(?<!\?)\+ 

Dopasowuje jeden lub więcej + znaki, jeśli nie są poprzedzone znakiem zapytania ?.

Edit: problem lub błąd z poprzedniej wypowiedzi, czy to, że nie obsługuje sytuacje jak ??+ lub ???+ lub ????+ lub, innymi słowy, że nie zajmuje się sytuacje, w których ? s są używane do ucieczki siebie.

Możemy rozwiązać ten problem, zauważając, że jeśli jest nieparzysta liczba ? poprzedzającego + następnie ostatni jest zdecydowanie ucieczki od + więc nie musi dzielić, ale jeśli jest parzysta liczba ? przed plusem następnie te anulują każdy opuszczając +, więc powinniśmy się rozdzielić.

Od poprzedniej obserwacji powinniśmy wymyślić wyraz, który odpowiada +tylko jeśli jest poprzedzone nawet liczby znaków zapytania ?, i to jest tutaj:

(?<!(^|[^?])(\?\?)*\?)\+ 
+0

Uruchomiłem kod testowy, wygląda na razie dobrze. Oznaczę to jako odpowiedź, gdy mam 100%. – hazimdikenli

+0

Cóż, właściwie wiele sąsiednich separatorów jest bardzo powszechnych, "+++++++" jest całkowicie poprawne i tak powinno być podzielone na puste ciągi. – hazimdikenli

+0

Zaktualizowałem poprawny łańcuch wyników, każdy znak '+' powinien dać nowy ciąg, przynajmniej pusty ciąg. – hazimdikenli

1
string[] lines = Regex.Split(data, @"\+"); 

Czy spełniałoby to wymaganie?

Tutaj jest edycja dla ucieczki "?" przed "+".

string[] lines = Regex.Split(data, @"(?<!\?)[\+]+"); 

Koniec "+" pasowałby do wielu kolejnych wystąpień seperatora "+". Jeśli chcesz zamiast tego białe spacje.

string[] lines = Regex.Split(data, @"(?<!\?)[\+]"); 
+0

lub może być pojedynczy "+" jako separator? i drugi powinien pojawić się – Irfan

+0

Nie, jeśli znak + jest poprzedzony znakiem zapytania, powinieneś go ocenić jako znak +, a nie jako separator. – hazimdikenli

Powiązane problemy