Як перевірити, чи рядок порожнім за допомогою регулярного вираження


154

Я намагаюся зробити простий регулярний вираз, який перевірить, чи рядок порожній чи ні.

Справа;

"    some"   // not blank
"   " //blank
"" // blank

Тут Пустий означає, що ви маєте на увазі. Рядок містить повний пробіл або рядок не містить нічого. Якщо ви хочете відповідати рядку, який нічого не містить, тоді використовуйте '/ ^ $ /'
Badri Gs

Відповіді:


329

Шар, який ви хочете, є приблизно таким у багаторядковому режимі:

^\s*$

Пояснення:

  • ^ є початком якорного рядка.
  • $ є кінцем якоря струни.
  • \s - клас символів пробілів.
  • * є нульовим або більше повторенням.

У багаторядковому режимі, ^а $також відповідати початку та кінця рядка.

Список літератури:


Альтернатива, що не піддається повторному вираженню:

Ви також можете перевірити, чи заданий рядок line"порожній" (тобто містить лише пробіли), trim()відмінивши його, а потім перевірити, чи є рядок у результаті isEmpty().

У Java це буде приблизно так:

if (line.trim().isEmpty()) {
    // line is "blank"
}

Рішення регулярного вираження також може бути спрощене без прив’язок (через те, як matchesвизначено в Java) наступним чином:

if (line.matches("\\s*")) {
    // line is "blank"
}

Посилання API


1
@Adnan: врахуйте коментар Барта у відповіді Марсело; залежно від того, як ви хочете обробити кілька порожніх рядків, шаблон може незначно змінитися.
полігенмастильні матеріали

Ну я читаю файл з Java, рядок за рядком, тому припускаю, що це буде добре.
Аднан

1
що здається блискучим з line.trim: D
Аднан

1
відмінні коди тепер виконуються від 1.6сек до> 1сек. Дякую.
Аднан

у python: if line.strip(): оскільки порожня рядок оцінюється доFalse
Джон Марк

58

Насправді в багаторядковому режимі правильнішою є відповідь:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Прийнята відповідь: ^\s*$не відповідає сценарію, коли останній рядок порожній (у багаторядковому режимі).


Саме так, і я підтвердив, що це так. Прийнята відповідь пропустила багато порожніх рядків у моєму файлі, але це все їх наздогнало. Об’єднання обох регексів наздоганяє кожен випадок.
elmor

1
Ця відповідь чудово працювала в такому інструменті, як Notepad ++. Прийнята відповідь збігається з кількома порожніми рядками, але не з одним порожнім.
Джеймс

У моєму випадку прийнята відповідь не працює в Sublime Text 3, і це працює.
янсібай

1
Прийнята відповідь спрацювала для моєї справи, мультиліній. Це робить.
Роберт Габріель

1
це має бути найкращою відповіддю.
Q я

12

Спробуйте це:

^\s*$

5
@Adnan, зауважте, що \sтакож відповідає розрив рядків, тому ви не знайдете "порожніх" рядків всередині рядка, що містять послідовні порожні рядки.
Барт Кіерс

6

Найбільш портативним регулярним виразом буде ^[ \t\n]*$збіг порожнього рядка (зауважте, що вам потрібно буде замінити \tта \nвідповідно табуляцію та новий рядок) та [^ \n\t]відповідати рядку, що не має пробілів.


Я хоч би змінив єдиний простір з класом[ \t]
Барт Кірс

1
У Windows також потрібно врахувати символ повернення каретки, \rтаким чином буде регулярний вираз ^[ \t\r\n]*$. Але ^\s*$краще - більш лаконічно. Якщо ви не хочете відповідати \h^\h*$
новим рядкам

5

Повна заслуга bchr02 за цю відповідь . Однак мені довелося трохи змінити його, щоб спіймати сценарій для рядків, у яких */(кінець коментаря) слідує порожній рядок. Режекс збігався з порожнім рядком */.

Нове: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Все, що я зробив, - це додати ^як другий символ для позначення початку рядка.


Чому б не прокоментувати відповідь bchr02 та запропонувати покращити його відповідь?
adamlogan

1
@adamlogan Так, на згадку, я думаю, я хотів це зробити в той час, але мені не вистачило репутації, щоб коментувати чужий пост, тому довелося робити це так.
Джон Генрі

3

Тут Пустий означає, що ви маєте на увазі.
Рядок містить повний пробіл або рядок не містить нічого.
Якщо ви хочете відповідати рядку, який нічого не містить, використовуйте '/ ^ $ /'.


-1

Ну ... я розібрався навколо (використовуючи блокнот ++), і це рішення, яке я знайшов

\ n \ с

\ n для кінця рядка (де ви починаєте відповідати) - карета не допоможе в моєму випадку, оскільки початок рядка є рядком \ s займає будь-який простір до наступного рядка

сподіваюся, що це допомагає


ОП хоче відповіді на регулярний вираз, який був наданий, а не про нові символи рядків.
Moody_Mudskipper

Користувач запитує "простий регулярний вираз, який перевірить, чи рядок порожній", цей регекс (протестований на regexpal.com) робить саме це. чому ви не тестуєте це?
M_TRONIC

з допомогою R, наш тестовий вектор: test_vec <- c(" some"," ",""). Ваше рішення: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE, хто проголосував рішення: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. рішення, яке проголосує, дає очікуваний результат, ваше - ні.
Moody_Mudskipper

як я сказав, я використав це на блокноті ++, і він працював. твій не став. тож я здогадуюсь, що ми можемо погодитися погодитися!
M_TRONIC

Я не дуже впевнений, чим ти займаєшся, ти робиш ctrl+fу блокноті ++? У цьому випадку ви можете знайти (хоча насправді не збігаються) порожні рядки, вибравши "Розширений" режим пошуку та шукаючи "\ n \ s", якщо ви виберете "Регулярне вираження", ваша рядок буде збігатися з тим самим, і ви можете також спробуйте рішення @polygenelubricants. Останнє дійсно буде відповідати рядку, ви можете перевірити і побачити різницю. Я б запропонував вам відредагувати свою відповідь, щоб бути більш зрозумілим щодо того, що ви радите, щоб читачі могли брати більше значення від це.
Moody_Mudskipper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.