Празни стрингове след Regex.Split().


0
Здравейте,
След като използвам Regex.Split() освен необходимите думи, получвам и многжество празни стрингове.
Като цяло си обеснявам защо, но не знам дали има някавък хитър начин да ги избегна?
Видях, че на String.Split() има опция StringSplitOptions.RemoveEmptyEntries, която набаче изглежда, че не работи при Regex.Split().

Някакви идеи?
Благодаря!



Отговори



3

Здравей, 

предлагам ти 2 решения,

1-вото с регулярен израз (твоят случай, просто трябва да използваш разширяващия метод: .Where(s => s != String.Empty) или .Where(=> !string.IsNullOrEmpty(s));

Regex lineSplitter = new Regex(@"Your Regular Expression");
var columns = lineSplitter.Split(data).Where(s => s != String.Empty);

2-рия вариант с метода Split и аргумента StringSplitOptions.RemoveEmptyEntries;

string[] columns = data.Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string c in columns) this.textBox1.Text += "[" + c.Trim(' ', '*') + "] " 

Източник: http://stackoverflow.com/questions/4912365/c-sharp-regex-split-removing-empty-results

Препоръчвам вторият вариант със .Split, можеш да изброяваш по какъв критерии да се разделят;

string[] columns = data.Split(new string[] { "word", "word2", "..." }, StringSplitOptions.RemoveEmptyEntries);

Поздрави!


от martin.nikolov (4535 точки)


0
String.Split() е готино, но май няма как да използваш регекс с него, което е малко кофти. Иначе мерси за отговора.

от Ivaylo1987 (557 точки)


0
Дай конкретен пример и някой със сигурност ще може да ти помогне. Това което се сещам че може да нправиш е да ползваш TRIM за получените стрингове, но си е по-добре още REGEX да ти дава точния резултат без да се налага допълнителна обработка

от wnvko (3123 точки)


0
Без точният код, трудно ще ти помогна, но в сплита, махаш ли и space-овете ?

от Hristo.B (3885 точки)


0
Накратко ако приложиш регекса - \s+|,\s*|!\s*|\.\s - върху иречението " C# is not C++, not PHP and not Delphi!" с Regex.Split(). Получаваш масив от думите в това иречение и накрая като послeден елемент имаш "" (празен стринг). Та въпросът ми беше как мога първоначално да се отърва от този празен стринг с нещо като StringSplitOptions.RemoveEmptyEntries, но да може да приложи към RegexSplit().

от Ivaylo1987 (557 точки)


0
Поиграх си още малко и се оказа , че има нещо допълнително следното нещо.
Когато използвам регекса: (\s+)|(,\s*)|(!\s*)|(\.\s*)
Изречението C# is not C++, not PHP and not Delphi! се сплитва на 19 части. Като в резултатът влизат не само думите, но и разделителите пример:
["C#"] [" "] ["is"] [" "] ["not"] ["C++"] [", "] ["PHP"]... и т.н.
А, когато иползвам същия регекс, но без скоби - \s+|,\s*|!\s*|\.\s* - тогава сработва и ми връща само думите без разделителите пример:
["C#"] ["is"] ["not"] ["C++"] ["PHP"]
Не мога да си обесня защо така и какво точно променят скобите?

от Ivaylo1987 (557 точки)


0
Виж msdn http://msdn.microsoft.com/en-us/library/8yttk7sy%28v=vs.110%29.aspx. В "remarks" секцията пише: "If capturing parentheses are used in a Regex.Split expression, any captured text is included in the resulting string array". Чрез кръглите скоби запазваш 'прихванатия' текст в backreference, която също е включена в резултата на "Regex.Split()".

от Stefanpu (404 точки)

0
Да това трябва да е. Много благодаря!

от Ivaylo1987 (557 точки)