I am trying to make simple regex that will check if a line is blank or not.
Case;
" some" // not blank
" " //blank
"" // blank
Lior Elrom
19.4k16 gold badges80 silver badges92 bronze badges
asked Jun 10, 2010 at 8:28
1
The pattern you want is something like this in multiline mode:
^s*$
Explanation:
^
is the beginning of string anchor.$
is the end of string anchor.s
is the whitespace character class.*
is zero-or-more repetition of.
In multiline mode, ^
and $
also match the beginning and end of the line.
References:
- regular-expressions.info/Anchors, Character Classes, and Repetition.
A non-regex alternative:
You can also check if a given string line
is «blank» (i.e. containing only whitespaces) by trim()
-ing it, then checking if the resulting string isEmpty()
.
In Java, this would be something like this:
if (line.trim().isEmpty()) {
// line is "blank"
}
The regex solution can also be simplified without anchors (because of how matches
is defined in Java) as follows:
if (line.matches("\s*")) {
// line is "blank"
}
API references
String String.trim()
- Returns a copy of the string, with leading and trailing whitespace omitted.
boolean String.isEmpty()
- Returns
true
if, and only if,length()
is0
.
- Returns
boolean String.matches(String regex)
- Tells whether or not this (entire) string matches the given regular expression.
answered Jun 10, 2010 at 8:35
3
Actually in multiline mode a more correct answer is this:
/(^(rn|n|r)$)|(^(rn|n|r))|^s*$/gm
The accepted answer: ^s*$
does not match a scenario when the last line is blank (in multiline mode).
Edit: added a ^
toward the beginning to catch the case of lines ending with */
followed by a new line. Thanks John Henry.
answered Sep 1, 2016 at 23:45
5
answered Jun 10, 2010 at 8:32
Marcelo CantosMarcelo Cantos
180k38 gold badges325 silver badges364 bronze badges
1
Full credit to bchr02 for this answer. However, I had to modify it a bit to catch the scenario for lines that have */
(end of comment) followed by an empty line. The regex was matching the non empty line with */
.
New: (^(rn|n|r)$)|(^(rn|n|r))|^s*$/gm
All I did is add ^
as second character to signify the start of line.
answered Oct 10, 2017 at 7:12
John HenryJohn Henry
1833 silver badges10 bronze badges
2
The most portable regex would be ^[ tn]*$
to match an empty string (note that you would need to replace t
and n
with tab and newline accordingly) and [^ nt]
to match a non-whitespace string.
answered Jun 10, 2010 at 8:34
soulmergesoulmerge
73.3k19 gold badges118 silver badges154 bronze badges
2
Here Blank mean what you are meaning.
A line contains full of whitespaces or a line contains nothing.
If you want to match a line which contains nothing then use ‘/^$/’.
answered Jun 10, 2010 at 8:37
kiruthikakiruthika
2,1557 gold badges26 silver badges33 bronze badges
1
Somehow none of the answers from here worked for me when I had strings which were filled just with spaces and occasionally strings having no content (just the line terminator), so I used this instead:
if (str.trim().isEmpty()) {
doSomethingWhenWhiteSpace();
}
answered Dec 5, 2022 at 12:17
Well…I tinkered around (using notepadd++) and this is the solution I found
ns
n for end of line (where you start matching) — the caret would not be of help in my case as the beginning of the row is a string
s takes any space till the next string
hope it helps
answered Aug 31, 2017 at 8:31
4
This regex will delete all empty spaces (blank) and empty lines and empty tabs from file
ns*
answered Apr 4, 2022 at 14:16
Just MeJust Me
7672 gold badges17 silver badges28 bronze badges
2
I use a validator that requires a regex to be specified. In the case of validating against an empty string, I don’t know how to generate such a regex. What regex can I use to match the empty string?
Paul Bellora
54.1k18 gold badges129 silver badges181 bronze badges
asked Jul 2, 2010 at 9:14
3
The regex ^$
matches only empty strings (i.e. strings of length 0). Here ^
and $
are the beginning and end of the string anchors, respectively.
If you need to check if a string contains only whitespaces, you can use ^s*$
. Note that s
is the shorthand for the whitespace character class.
Finally, in Java, matches
attempts to match against the entire string, so you can omit the anchors should you choose to.
References
- regular-expressions.info/Character classes and Anchors
API references
String.matches
,Pattern.matches
andMatcher.matches
Non-regex solution
You can also use String.isEmpty()
to check if a string has length 0. If you want to see if a string contains only whitespace characters, then you can trim()
it first and then check if it’s isEmpty()
.
answered Jul 2, 2010 at 9:16
1
I don’t know about Java specifically, but ^$
usually works (^
matches only at the start of the string, $
only at the end).
answered Jul 2, 2010 at 9:16
ChowlettChowlett
45.7k19 gold badges116 silver badges150 bronze badges
If you have to use regexp in Java for checking empty string you can simply use
testString.matches("")
please see examples:
String testString = "";
System.out.println(testString.matches(""));
or for checking if only white-spaces:
String testString = " ";
testString.trim().matches("");
but anyway using
testString.isEmpty();
testString.trim().isEmpty();
should be better from performance perspective.
public static void main(String[] args) {
String testString = "";
long startTime = System.currentTimeMillis();
for (int i =1; i <100000000; i++) {
// 50% of testStrings are empty.
if ((int)Math.round( Math.random()) == 0) {
testString = "";
} else {
testString = "abcd";
}
if (!testString.isEmpty()){
testString.matches("");
}
}
long endTime = System.currentTimeMillis();
System.out.println("Total testString.empty() execution time: " + (endTime-startTime) + "ms");
startTime = System.currentTimeMillis();
for (int i =1; i <100000000; i++) {
// 50% of testStrings are empty.
if ((int)Math.round( Math.random()) == 0) {
testString = "";
} else {
testString = "abcd";
}
testString.matches("");
}
endTime = System.currentTimeMillis();
System.out.println("Total testString.matches execution time: " + (endTime-startTime) + "ms");
}
Output:
C:Javajdk1.8.0_221binjava.exe
Total testString.empty() execution time: 11023ms
Total testString.matches execution time: 17831ms
answered Jun 24, 2019 at 15:57
David AbragimovDavid Abragimov
5092 gold badges6 silver badges21 bronze badges
2
For checking empty string i guess there is no need of regex itself…
u Can check length of the string directly ..
in many cases empty string and null checked together for extra precision.
like String.length >0 && String != null
answered Jul 2, 2010 at 11:44
Как регуляркой проверять на пустоту?
Как регуляркой проверять на пустоту?
-
Вопрос заданболее трёх лет назад
-
2212 просмотров
Регулярка: /^$/
Пример:
var str1 = "";
var str2 = "qwerty";
var re=/^$/;
console.log( re.test(str1) ); // true
console.log( re.test(str2) ); // false
Пригласить эксперта
Смотря что считать пустотой.
Если это все пробельные символы, то примерно так: ^s*$
(Расшифровывается, как любое количество пробельных символов, даже нулевое, от начала и до конца строки).
-
Показать ещё
Загружается…
25 мая 2023, в 20:52
2500 руб./за проект
25 мая 2023, в 20:48
1800 руб./за проект
25 мая 2023, в 20:19
2500 руб./за проект
Минуточку внимания
English | Русский | Deutsch | Български | Français | Español |
Вступление¶
Регулярные выражения — удобный способ описывать шаблоны текстов.
С помощью регулярных выражений вы можете проверять пользовательский ввод, искать некоторые шаблоны, такие как электронные письма телефонных номеров на веб-страницах или в некоторых документах и так далее.
Ниже приведена исчерпывающая шпаргалка по регулярных выражениям всего на одной странице.
Символы¶
Простые совпадения¶
Серия символов соответствует этой серии символов во входной строке.
RegEx | Находит |
---|---|
foobar |
foobar |
Непечатные символы (escape-коды)¶
Для представления непечатаемого символа в регулярном выражении используется x
с шестнадцатеричным кодом. Если код длиннее 2 цифр (более U+00FF), то он обрамляется в фигурные скобки.
RegEx | Находит |
---|---|
xAB |
символ с 2-значным шестнадцатеричным кодом AB |
x{AB20} |
символ с 1-4 значным шестнадцатеричным кодом AB20 |
foox20bar |
foo bar (обратите внимание на пробел в середине) |
Существует ряд предопределенных escape-кодов
для непечатных символов, как в языке C
:
RegEx | Находит |
---|---|
t |
tab (HT/TAB), тоже что x09 |
n |
символ новой строки (LF), то же что x0a |
r |
возврат каретки (CR), тоже что x0d |
f |
form feed (FF), то же что x0c |
a |
звонок (BEL), тоже что x07 |
e |
escape (ESC), то же что x1b |
cA … cZ |
chr(0) по chr(25). Например Также поддерживаются буквы в нижнем регистре «a»…»z». |
Эскейпинг¶
Для представления спецсимволов (.+*?|()[]{}^$
), перед ними надо поставить . Чтобы вставить сам обратный слэш его надо удвоить.
RegEx | Находит |
---|---|
^FooBarPtr |
^FooBarPtr здесь ^ не означает начало строки |
[a] |
[a] это не класс символов |
Классы символов¶
Пользовательские классы¶
Символьный класс — это список символов внутри []
. Класс соответствует любому одному символу, указанному в этом классе.
RegEx | Находит |
---|---|
foob[aeiou]r |
foobar , foober и т. д., но не foobbr , foobcr и т. д. |
Вы можете инвертировать
класс — если первый символ после [
является ^
, то класс соответствует любому символу, кроме символов, перечисленных в классе.
RegEx | Находит |
---|---|
foob[^aeiou]r |
foobbr , foobcr и т. д., но не foobar , foober и т. д. |
Внутри списка символ -
используется для указания диапазона, так что a-z
представляет все символы между a
и z
включительно.
Если вы хотите, чтобы -
сам был членом класса, поместите его в начало или конец списка или предварите его обратной косой чертой (escape).
Если вы хотите буквально использовать символ ]
поместите его в начало списка или escape обратной косой чертой.
RegEx | Находит |
---|---|
[-az] |
a , z и - |
[az-] |
a , z и - |
[А-z] |
a , z и - |
[a-z] |
символы от a до z |
[n-x0D] |
символы от #10 до #13 |
Разделители¶
Разделители строк¶
Метасимвол | Находит |
---|---|
. |
любой символ в строке, может включать разделители строк |
^ |
совпадение нулевой длины в начале строки |
$ |
совпадение нулевой длины в конце строки |
A |
совпадение нулевой длины в начале строки |
z |
совпадение нулевой длины в конце строки |
Z |
похож на z но совпадает перед разделителем строки, а не сразу после него, как z |
Примеры:
RegEx | Находит |
---|---|
^foobar |
foobar только если он находится в начале строки |
foobar$ |
foobar , только если он в конце строки |
^foobar$ |
foobar только если это единственная строка в строке |
foob.r |
foobar , foobbr , foob1r и так далее |
Метасимвол ^
совпадает с точкой начала строки (нулевой длины). $
— в конце строки. Если включен modifier /m , они совпадают с началами или концами строк внутри текста.
Обратите внимание, что в последовательности x0Dx0A
нет пустой строки.
Примечание
TRegExpr
Если вы используете Unicode версию, то ^
/$
также соответствует x2028
, x2029
, x0B
, x0C
или x85
.
Метасимвол A
совпадает с точкой нулевой длины в начале строки, z
— в конце (после символов завершения строки). Модификатор modifier /m на них не влияет. Z
тоже самое что z
но совпадает с точкой перед символами завершения строки (LF and CR LF).
Метасимвол .
по умолчанию соответствует любому символу, но если вы выключите modifier /s, то .
не будет совпадать с разделителями строк внутри строки.
Обратите внимание, что выражение ^.*$
не соответствует точке между x0Dx0A
, потому что это неразрывный разделитель строк. Но оно соответствует пустой строке в последовательности x0Ax0D
, поэтому из-за неправильного порядка кодов он не воспринимается как разделитель строк и считается просто двумя символами.
Примечание
TRegExpr
Многострочная обработка может быть настроена с помощью свойств LineSeparators и LinePairedSeparator.
Таким образом, вы можете использовать разделители стиля Unix n
или стиль DOS / Windows rn
или смешивать их вместе (как описано выше по умолчанию).
Если вы предпочитаете математически правильное описание, вы можете найти его на сайте www.unicode.org.
Разделители слов¶
RegEx | Находит |
---|---|
b |
разделитель слов |
B |
разделитель с не-словом |
Граница слова b
— это точка между двумя символами, у которой w
с одной стороны от нее и W
с другой стороны (в любом порядке).
Повторы¶
Повтор¶
За любым элементом регулярного выражения может следовать допустимое число повторений элемента.
RegEx | Находит |
---|---|
{n} |
ровно n раз |
{n,} |
по крайней мере n раз |
{n,m} |
по крайней мере n , но не более чем m раз |
* |
ноль или более, аналогично {0,} |
+ |
один или несколько, похожие на {1,} |
? |
ноль или единица, похожая на {0,1} |
То есть цифры в фигурных скобках {n,m}
определяются минимальное n
и максимальное m
количество повторов (совпадений во входном тексте).
{n}
эквивалентно {n,n}
и означает точно n раз
. {n,}
совпадает n
или более раз.
Теоретически значение n и m не ограничены (можно использовать максимальное значение для 32-х битного числа).
RegEx | Находит |
---|---|
foob.*r |
foobar , foobalkjdflkj9r и foobr |
foob.+r |
foobar , foobalkjdflkj9r , но не foobr |
foob.?r |
foobar , foobbr и foobr , но не foobalkj9r |
fooba{2}r |
foobaar |
fooba{2}r |
foobaar , foobaaar , foobaaaar и т. д. |
fooba{2,3}r |
foobaar , или foobaaar , но не foobaaaar |
(foobar){8,10} |
8 , 9 или 10 экземпляров foobar (() это Группа) |
Жадность¶
Повторы в жадном
режиме захватывают как можно больше из входного текста, в не жадном
режиме — как можно меньше.
По умолчанию все повторы являются жадными
. Используйте ?
Чтобы сделать любой повтор не жадным
.
Для строки abbbbc
:
RegEx | Находит |
---|---|
b+ |
bbbb |
Ь+? |
b |
b*? |
пустую строку |
b{2,3}? |
bb |
b{2,3} |
bbb |
Вы можете переключить все повторы в не жадный
режим (modifier /g, ниже мы используем in-line модификатор change).
RegEx | Находит |
---|---|
(?-g)Ь+ |
b |
Сверхжадные повторы (Possessive Quantifier)¶
Синтаксис: a++
, a*+
, a?+
, a{2,4}+
. В настоящее время реализован только для простых групп и не будет работать для сложны, как например (foo|bar){3,5}+
.
Полное описание (на английском) Вкратце, сверхжадный повтор ускоряет работу в сложных случаях.
Альтернативы¶
Выражения в списке альтернатив разделяются |
.
Таким образом, fee|fie|foe
будет соответствовать любому из fee
, fie
или foe
(также как и f(e|i|o)e
).
Первое выражение включает в себя все от последнего разделителя шаблона ((
, [
или начало шаблона) до первого |
, а последнее выражение содержит все от последнего |
к следующему разделителю шаблона.
Звучит сложно, поэтому обычной практикой является заключение списка альтернатив в скобки, чтобы минимизировать путаницу относительно того, где он начинается и заканчивается.
Выражения в списке альтернатив пробуются слева направо, принимается первое же совпадение.
Например, регулярное выражение foo|foot
в строке barefoot
будет соответствовать foo
— первое же совпадение.
Также помните, что |
в квадратных скобках воспринимается просто как символ, поэтому, если вы напишите [fee|fie|foe]
, это тоже самое что [feio|]
.
RegEx | Находит |
---|---|
foo(bar|foo) |
foobar или foofoo |
Группы (подвыражения)¶
Скобки (...)
также могут использоваться для определения групп (подвыражений) регулярного выражения.
Подвыражения нумеруются слева направо по открывающим их скобкам (включая вложенные группы (подвыражения). У первой группы номер 1. У выражения в целом — 0.
Например, для входной строки
foobar
регулярное выражение(foo(bar))
найдет:
Группы (подвыражения) значение 0 foobar
1 foobar
2 bar
Ссылки на группы (Backreferences)¶
Метасимволы от 1
до 9
интерпретируются как ссылки на группы. Они соответствуют ранее найденной группе с соответствующим индексом..
RegEx | Находит |
---|---|
(.)1+ |
aaaa и cc |
(.+)1+ |
также abab и 123123 |
(['"]?)(d+)1
соответствует "13"
(в двойных кавычках) или '4'
(в одинарных кавычках) или 77
(без кавычек) и т. д.
Именованные группы (подвыражения) и ссылки на них¶
Чтобы присвоить имя группе используйте (?P<name>expr)
или (?'name'expr)
.
Имя группы должно начинаться с буквы или _
, далее следуют буквы, цифры или _
. Именованные и не именованные группы имеют общую нумерацию от 1
до 9
.
Чтобы сослаться на именованную группу используйте (?P=name)
. Или, как и для не именованных, цифры от 1
до 9
.
RegEx | Находит |
---|---|
(?P<qq>['"])w+(?P=qq) |
"word" и 'word' |
Модификаторы¶
Модификаторы предназначены для изменения поведения регулярных выражений.
Вы можете установить модификаторы глобально в вашей системе или изменить их внутри регулярного выражения, используя (?imsxr-imsxr).
Примечание
TRegExpr
Для изменения модификаторов используйте ModifierStr или соответствующие TRegExpr
свойства Модификатор *.
Значения по умолчанию определены в глобальных переменных. Скажем, глобальная переменная RegExprModifierX
определяет значение по умолчанию для свойства ModifierX
.
i, без учета регистра¶
Регистро-независимые сравнения. Использует установленные в вашей системе языковые настройки, см. также InvertCase.
m, многострочные строки¶
Обрабатывать строку как несколько строк. Таким образом, ^
и $
соответствуют началу или концу любой строки в любом месте строки.
Смотрите также Разделители строк.
s, одиночные строки¶
Обрабатывать строку как одну строку. Так что .
соответствует любому символу, даже разделителям строк.
Смотрите также Разделители строк, которые обычно не совпадают.
г, жадность¶
Примечание
Специфичный для TRegExpr модификатор.
Отключив его Off
, вы переключите повторитель в не-жадный режим.
Итак, если модификатор /g
имеет значение Off
, то +
работает как +?
, *
как *?
и так далее.
По умолчанию этот модификатор имеет значение Выкл
.
x, расширенный синтаксис¶
Позволяет комментировать регулярные выражения и разбивать их на несколько строк.
Если модификатор включен, мы игнорируем все пробелы, которые не заэскейплены обратной косой чертой, и не включены в класс символов.
Также символ #
отделяет комментарии.
Обратите внимание, что вы можете использовать пустые строки для форматирования регулярного выражения для лучшей читаемости:
( (abc) # комментарий 1 # (efg) # комментарий 2 )
Это также означает, что если вам нужно вставить пробел или символ #
в шаблон (вне класса символов, где они не затрагиваются /x
), вам придется либо эскейпить их, либо кодировать, используя шестнадцатеричный код.
г, русские диапазоны¶
Примечание
Специфичный для TRegExpr модификатор.
В русской таблице ASCII символы ё
/ Ё
размещаются отдельно от других.
Большие и маленькие русские символы находятся в отдельных диапазонах, это не отличается от ситуации с английскими символами, но, тем не менее, я хотел иметь краткую форму.
С этим модификатором вместо [а-яА-ЯёЁ]
вы можете написать [а-Я]
, если вам нужны все русские символы.
Когда модификатор включен:
RegEx | Находит |
---|---|
а-я |
символы от а до я и ё |
А-Я |
символы от А до Я и Ё |
а-Я |
все русские символы |
Модификатор по умолчанию установлен на Вкл
.
Проверки или заглядывания вперед и назад (Assertions)¶
Заглядывание вперед (lookahead assertion) foo(?=bar)
совпадает «foo» только перед «bar», при этом сама строка «bar» не войдет в найденный текст.
Отрицательное заглядывание вперед (negative lookahead assertion): foo(?!bar)
совпадает «foo» только если после этой строки не следует «bar».
Ретроспективная проверка (lookbehind assertion): (?<=foo)bar
совпадает «bar» только после «foo», при этом сама строка «foo» не войдет в найденный текст.
Отрицательное заглядывание назад (negative lookbehind assertion): foo(?!bar)
совпадает «bar» только если перед этой строкой нет «foo».
Ограничения:
- Скобки для заглядываний вперед должны быть в самом начале выражения. Не поддерживаются заглядывания внутри альтернатив (
|
) или групп. - Для заглядывания назад
(?<!foo)bar
, выражение «foo» должно быть фиксированной длины. Допустимы повторы только с фиксированным числом{n}
или{n,n}
. Разрешено использование классов символов и точки. Не разрешены группы и альтернативы. - Для остальных трех типов заглядываний, выражение в скобках может быть сколь угодно сложным.
Не захватываемые группы (подвыражения)¶
Синтаксис: (?:subexpression)
.
У этих групп (подвыражений) нет номера, их нельзя указать в ссылке на группу. Эти группы используют чтобы за счет группировки сделать регулярное выражение более читаемым, но нет необходимости расходовать ресурсы на то, чтобы реально отдельно захватывать то, с чем такие группы совпадут:
RegEx | Находит |
---|---|
(https?|ftp)://([^/rn]+) |
в https://sorokin.engineer захватит подвыражения https и sorokin.engineer |
(?:https?|ftp)://([^/rn]+) |
в https://sorokin.engineer захватит только sorokin.engineer |
Атомарные группы¶
Синтаксис: (?>expr|expr|...)
.
Атомарные группы это специальный случай незахватывающих групп. Подробнее
Модификаторы¶
Синтаксис для одного модификатора: (?i)
чтобы включить, и (?-i)
чтобы выключить. Для большого числа модификаторов используется синтаксис: (?msgxr-imsgxr)
.
Можно использовать внутри регулярного выражения. Это может быть особенно удобно, поскольку оно имеет локальную область видимости. Оно влияет только на ту часть регулярного выражения, которая следует за оператором (?imsgxr-imsgxr)
.
И если оно находится внутри подвыражения, оно будет влиять только на это подвыражение, а именно на ту часть подвыражения, которая следует за оператором. Таким образом, в ((?i)Saint)-Petersburg
это влияет только на подвыражение ((?i)Saint)
, поэтому оно будет соответствовать saint-Petersburg
, но не saint-petersburg
.
RegEx | Находит |
---|---|
(?i)Saint-Petersburg |
Saint-petersburg и Saint-Petersburg |
(?i)Saint-(?-i)Petersburg |
Saint-Petersburg , но не Saint-petersburg |
(?i)(Saint-)?Petersburg |
Saint-petersburg и saint-petersburg |
((?i)Saint-)?Petersburg |
saint-Petersburg , но не saint-petersburg |
Рекурсия¶
Синтаксис (?R)
, синоним (?0)
.
Выражение a(?R)?z
совпадает с одним или более символом «a» за которым следует точно такое же число символов «z».
Основное назначение рекурсии — сбалансировать обрамление вложенного текста. Общий вид b(?:m|(?R))*e
где «b» это то что начинает обрамляемый текст, «m» это собственно текст, и «e» это то, что завершает обрамление.
Если же обрамляемый текст также может встречаться без обрамления то выражение будет b(?R)*e|m
.
Вызовы подвыражений¶
Нумерованные группы (подвыражения) обозначают (?1)
… (?90)
(максимальное число групп определяется константой в TRegExpr).
Синтаксис для именованных групп : (?P>name)
. Поддерживается также Perl вариант синтаксиса: (?&name)
.
Это похоже на рекурсию, но повторяет только указанную группу (подвыражение).
Unicode категории (category)¶
В стандарте Unicode есть именованные категории символов (Unicode category). Категория обозначается одной буквой, и еще одна добавляется, чтобы указать подкатегорию. Например «L» это буква в любом регистре, «Lu» — буквы в верхнем регистре, «Ll» — в нижнем.
- Cc — Control
- Cf — Формат
- Co — Частное использование
- Cs — Заменитель (Surrrogate)
- Ll — Буква нижнего регистра
- Lm — Буква-модификатор
- Lo — Прочие буквы
- Lt — Titlecase Letter
- Lu — Буква в верхнем регистре
- Mc — Разделитель
- Me — Закрывающий знак (Enclosing Mark)
- Mn — Несамостоятельный символ, как умляут над буквой (Nonspacing Mark)
- Nd — Десятичная цифра
- Nl — Буквенная цифра — например, китайская, римская, руническая и т.д. (Letter Number)
- No — Другие цифры
- Pc — Connector Punctuation
- Pd — Dash Punctuation
- Pe — Close Punctuation
- Pf — Final Punctuation
- Pi — Initial Punctuation
- Po — Other Punctuation
- Ps — Open Punctuation
- Sc — Currency Symbol
- Sk — Modifier Symbol
- Sm — Математический символ
- So — Прочие символы
- Zl — Разделитель строк
- Zp — Разделитель параграфов
- Zs — Space Separator
Meta-character p
denotes one Unicode char of specified category. Syntax: pL
and p{L}
for 1-letter name, p{Lu}
for 2-letter names.
Метасимвол P
это символ не из Unicode категории (category).
These meta-characters are supported within character classes too.
В данной статье рассматривается практическое применение регулярных выражений в Notepad++. Сначала будет кратко рассмотрена общая теория: как включить поиск по регулярному выражению, какой символ за что отвечает, в каких случаях без регулярных выражений не обойтись. Далее будут рассмотрены конкретные ситуации из жизни автора, когда поиск по регулярному выражению оказался прямо-таки спасением ситуации и значительно сэкономил время на рутинные операции.
Итак, перейдем сразу к делу: Как включить поиск по регулярному выражению в notepad++? К счастью, тут все просто. Нужно нажать ctrl + F (как и для обычного поиска) и во всплывшем окне переключиться в режим «регулярное выражение» (см. скриншот ниже).
После этого простого действия, можно в строку «найти» вписывать шаблоны для поиска. Данные шаблоны строятся из набора определенных спецсимволов, которые, для удобства восприятия, разбиты по пунктам:
- ^ — Символ начала строки
- $ — Символ конца строки
- . (Точка) — один любой символ
- [0-9] — любая цифра
- [a-z] — любой символ латинского алфавита в нижнем регистре
- [A-Z] — любой символ латинского алфавита в верхнем регистре
- [a-zA-Z] и (эквивалент) [a-Z] — любой символ латинского алфавита в любой регистре
- s — символ пробела
- S — (обратно предыдущему) не пробел
- w — любая цифра, буква или подчеркивание
- d — любая цифра
- D — (обратно предыдущему) любой символ, но не цифра
- * — Повтор предыдущего символа. То есть символ перед звездочкой может повторяться 0 и более раз. Например: .* — представляет собой абсолютно любой набор символов
- n — символ новой строки
В принципе, приведенных спецсимволов достаточно для того, чтобы начинать писать шаблоны для поиска по регулярному выражению. Но, для начала, рассмотрим в каких ситуациях может возникнуть надобность писать данные регулярные выражения.
Надобность в в применении регулярных выражений может возникнуть тогда, когда нужно обработать большой массив текстовой информации для того, чтобы найти схожие, но не идентичные фрагменты текста. Например: очистить текст от html-тегов, удалить простейший числовой ряд (на каждой строке до или после текста работает «счетчик», в котором число возрастает на +1), приведение дат к единому формату и тому подобные ситуации. Как ни странно, необходимость прибегнуть к регулярным выражениям может возникнуть не только у программиста, но и у маркетолога, например если требуется «выдернуть» какую-либо информацию из xml-фида данных.
Итак, рабочие ситуации:
Как удалить tррabs с разными url?
tppabs — это специфический атрибут, который добавляет «программа-грабилка» teleport pro при «скачивании» какого-либо сайта. В коде страницы атрибут выглядит следующим образом: tppabs=»http://example.ru/img/112″
Для удаления таких тегов подойдет следующее регулярное выражение:
tppabs=»(.+?)»
Заменить на пустое значение (или пробел, в зависимости от ситуации).
Как удалить строку с числовой последовательностью?
Есть большой массив данных, каждая строка в которой начинается с текста «Line (1…100000):
Цель — удалить эти символы и не трогать остальные данные. Такая ситуация может возникнуть, когда был сделан поиск в Notepad++ по большому файлу, а далее результаты были скопированы в новый файл. Естественно, от этих Line следует избавиться как можно скорее.
Для этого подойдет следующее регулярное выражение: .*Line.[0-9]*: (.* Добавлены на случай, если перед Line стоят символы табуляции, что очень вероятно).
Как обернуть в кавычки текст на каждой строке?
Например, есть большой массив ключевых слов. Каждая ключевая фраза расположена на отдельной строке и каждую ключевую фразу нужно обернуть в кавычки. Для этого подойдет следующее регулярное выражение: ^(.*)$
Стоит учесть: в строке «Заменить на» надо написать следующее: «1» (1 в данном случае возвращенное поиском значение, уникальное для каждой строки, если написать в «заменить на» — «^(.*)$» (именно в кавычках, то все строки заменятся именно на «^(.*)$»).
Как найти пустые строки с помощью регулярного выражения?
Для этого может подойти одно из двух регулярных выражений:
А) nr и если не помогает, то:
Б) ^s*$
Как заменить один html-тег на другой?
Может возникнуть ситуация, когда определенные теги, которыми обернут текст, нужно заменить на другие (например, тег p заменить на div). Для этого подойдет следующее регулярное выражение: <span>(.*)</span> и соответственно, в «заменить на» нужно прописать: <div>1</div>
Как удалить всё после определенного символа?
Пример получился довольно отвлеченный: В файле нужно удалить в каждой строке все символы, которые идут после слова php (К слову, может пригодиться, если нужно удалить utm-метки из массива url). Для этого подойдет выражение следующего формата:
(.*)php(.*) и в «заменить на» указать 1
Вот, собственно, и все. В статье были рассмотрены случаи, с которыми автор сталкивался более одного раза и применение регулярных выражений помогло в таких ситуациях сэкономить уйму времени. Конечно, применение регулярных выражений (даже если рассматривать их в контексте Notepad++) не ограничивается только вышеприведенными примерами, тема эта довольно объемная и интересная, но общий принцип можно описать следующими словами:
Обработка больших объемов текстовых данных по определенному шаблону для экономии времени