Мо ба таваҷҷуҳи шумо тарҷумаи дастури кӯтоҳро оид ба ибораҳои муқаррарӣ ба забони Java пешкаш менамоем, ки аз ҷониби Ҷефф Фризен барои вебсайти
JavaWorld навишта шудааст . Барои осонии хондан, мо мақоларо ба чанд қисм тақсим кардем.
Истифодаи API муқаррарии Expression дар барномаҳои Java барои шинохтан ва тавсифи намунаҳо
Хусусияти Java ва намудҳои гуногуни додаҳои сатр барои мувофиқати намуна дастгирии сатҳи пастро таъмин мекунанд, аммо истифодаи онҳо бо ин мақсад маъмулан мураккабии назарраси codeро илова мекунад. Рамзи соддатар ва иҷрошаванда тавассути истифодаи Regex API ("Regular Expression API") ба даст оварда мешавад. Ин дастур ба шумо дар оғоз кардани ифодаҳои муқаррарӣ ва API Regex кӯмак мекунад. Мо аввал се синфи ҷолибтаринро дар маҷмӯъ муҳокима хоҳем кард
java.util.regex
ва сипас ба дохor синф назар андозем
Pattern
ва конструксияҳои мураккаби мувофиқи намунаи онро омӯзем.
Диққат: Шумо метавонед рамзи сарчашмаро (аз ҷониби Ҷефф Фризен барои сайти JavaWorld сохтааст) аз ин мақола
аз ин ҷо зеркашӣ кунед .
Ибораҳои муқаррарӣ чист?
Ифодаи муқаррарӣ (ифодаи муқаррарӣ/regex/regexp) сатрест, ки намунаест, ки маҷмӯи муайяни сатрҳоро тавсиф мекунад. Намуна муайян мекунад, ки кадом сатрҳо ба маҷмӯа тааллуқ доранд. Намуна аз калимаҳои аслӣ ва метаҳарфаҳо иборат аст - аломатҳои дорои маънои махсус, на маънои аслӣ. Мутобиқсозии намуна ҷустуҷӯи матн барои дарёфти мувофиқат, яъне сатрҳое мебошад, ки ба намунаи ифодаи муқаррарӣ мувофиқат мекунанд. Java мувофиқати намунаро тавассути API Regex-и худ дастгирӣ мекунад. Ин API аз се синф иборат аст:
Pattern
,
Matcher
ва
PatternSyntaxException
, дар баста ҷойгир аст
java.util.regex
:
- an objectҳои синф
Pattern
, ки онҳоро қолабҳо меноманд, ифодаҳои муқаррарӣ тартиб дода мешаванд.
- an objectҳои синфӣ
Matcher
ё мувофиқкунандаҳо механизмҳои тафсири намуна барои дарёфти мувофиқатҳо дар пайдарпаии аломатҳо мебошанд (an objectҳое, ки синфҳои онҳо интерфейсро амалӣ мекунанд java.lang.CharSequence
ва ҳамчун манбаи матн хидмат мекунанд).
- Объектҳои синф
PatternSyntaxException
барои тавсифи намунаҳои ифодаи муқаррарии беэътибор истифода мешаванд.
Java инчунин барои мувофиқ кардани намуна тавассути усулҳои гуногуни
java.lang.String
. Масалан, функсия танҳо он вақт
boolean matches (String regex)
бармегардад
true
, ки сатри даъваткунанда ба ифодаи муқаррарӣ дақиқ мувофиқат кунад
regex
.
Усулҳои қулай |
matches() ва дигар усулҳои бароҳатии муқаррарии ба ифода нигаронидашудаи синф String дар зери сарпӯш ба таври шабеҳ ба Regex API амалӣ карда мешаванд. |
RegexDemo
Ман барномаеро
RegexDemo
барои намоиш додани ифодаҳои муқаррарии Java ва усулҳои гуногуни
Pattern
,
Matcher
ва
PatternSyntaxException
. Дар зер рамзи сарчашма барои ин барномаи намоишӣ оварда шудааст. Рӯйхат 1. Намоиши ифодаи муқаррарӣ
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("usage: java RegexDemo regex input");
return;
}
args[1] = args[1].replaceAll("\\\\n", "\n");
try
{
System.out.println("regex = " + args[0]);
System.out.println("input = " + args[1]);
Pattern p = Pattern.compile(args[0]);
Matcher m = p.matcher(args[1]);
while (m.find())
System.out.println("Found [" + m.group() + "] starting at "
+ m.start() + " and ending at " + (m.end() - 1));
}
catch (PatternSyntaxException pse)
{
System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
System.err.println("Описание: " + pse.getDescription());
System.err.println("Позиция: " + pse.getIndex());
System.err.println("Неправильный шаблон: " + pse.getPattern());
}
}
}
main
Аввалин чизе, ки усули синф мекунад,
RegexDemo
санҷидани сатри фармони он аст. Он ду далелро талаб мекунад: якум ифодаи муқаррарӣ ва дуюм матни воридотӣ, ки дар он ифодаи муқаррарӣ ҷустуҷӯ карда мешавад. Шояд шумо бояд аломати сатри навро дар дохor матни воридотӣ истифода баред
(\n)
. Инро танҳо бо муайян кардани аломати
\
пас аз аломат анҷом додан мумкин аст
n
. Функсия
main()
ин пайдарпаии аломатҳоро ба арзиши Юниcode 10 табдил медиҳад.
Қисми асосии code
RegexDemo
дар дохor
try-catch
. Блок
try
аввал ифодаи муқаррарии додашуда ва матни вурудро мебарорад ва сипас an objectеро месозад
Pattern
, ки ифодаи муқаррарии тартибдодашударо нигоҳ медорад (ифодаҳои муқаррарӣ барои беҳтар кардани иҷрои мувофиқати намуна тартиб дода мешаванд). Мутобиқкунанда аз an object гирифта мешавад
Pattern
ва барои ҷустуҷӯи мувофиқатҳо ба таври такрорӣ то пайдо шудани ҳама истифода мешавад. Блок
catch
якчанд усулҳои синфро
PatternSyntaxException
барои дарёфти маълумоти муфид дар бораи истисно даъват мекунад. Ин маълумот пайдарпай ба ҷараёни баромад бароварда мешавад. Ҳанӯз донистани тафсилоти чӣ гуна кор кардани code лозим нест: онҳо ҳангоми омӯхтани API дар қисми дуюми мақола равшан хоҳанд шуд. Аммо, шумо бояд Рӯйхати 1-ро тартиб диҳед. Рамзро аз Рӯйхати 1 гиред ва сипас дар сатри фармон фармони зеринро ворид кунед, то тартиб диҳед
RegexDemo
:
javac RegexDemo.java
Синфи Pattern ва сохторҳои он
Синф
Pattern
, аввалин аз се синф, ки API-и Regex-ро ташкил медиҳанд, намояндагии тартибдодашудаи ифодаи муқаррарӣ мебошад. Ҳуҷҷатҳои синфи SDK
Pattern
сохторҳои гуногуни ифодаи муқаррариро тавсиф мекунад, аммо агар шумо ифодаҳои муқаррариро фаъолона истифода набаред, қисмҳои ин ҳуҷҷат метавонад печида бошад. Миқдорҳо чист ва фарқияти миқдорҳои тамаъкор, нохоҳам ва соҳибӣ чист? Синфҳои аломатҳо, мувофиқати сарҳадҳо, истинодҳои бозгашт ва ифодаҳои парчами дарунсохт чист? Ман ба ин ва дигар саволҳо дар бахшҳои минбаъда посух хоҳам дод.
Сатрҳои аслӣ
Соддатарин сохтори ифодаи муқаррарӣ сатри аслӣ мебошад. Барои бомуваффақият мувофиқ кардани намуна, як қисми матни воридотӣ бояд ба намунаи он сохтор мувофиқат кунад. Мисоли зеринро дида бароед:
java RegexDemo apple applet
Дар ин мисол, мо кӯшиш мекунем, ки мувофиқатеро барои намуна
apple
дар матни воридотӣ пайдо кунем
applet
. Натиҷаи зерин бозии ёфтшударо нишон медиҳад:
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Мо дар баромад ифодаи муқаррарӣ ва матни воридшударо мебинем, ва он гоҳ нишондиҳандаи бомуваффақият
apple
дар апплет пайдо мешавад. Илова бар ин, мавқеъҳои ибтидоӣ ва охири ин бозӣ мувофиқан дода шудаанд:
0
ва
4
. Мавқеи ибтидоӣ ҷои аввалро дар матн, ки дар он мувофиқат ёфт шудааст ва мавқеи ниҳоӣ нуқтаи охирини мувофиқатро нишон медиҳад. Акнун биёед бигӯем, ки мо сатри фармони зеринро додем:
java RegexDemo apple crabapple
Ин дафъа мо натиҷаи зеринро бо мавқеъҳои гуногуни оғоз ва хотима мегирем:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Дар акси ҳол, бо ва
applet
ҳамчун ифодаи муқаррарӣ
apple
- матни воридотӣ ягон мувофиқат пайдо намешавад. Тамоми ифодаи муқаррарӣ бояд мувофиқат кунад, аммо дар ин ҳолат матни воридшуда
t
пас аз
apple
.
Метааломатҳо
Конструкцияҳои ҷолибтари ифодаи муқаррарӣ аломатҳои аслиро бо мета аломатҳо муттаҳид мекунанд. Масалан, дар ифодаи муқаррарӣ
a.b
, мета аломати нуқта
(.)
маънои ҳар гуна аломати байни
a
ва b мебошад. Мисоли зеринро дида бароед:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Ин мисол
.ox
ҳам ҳамчун ифодаи муқаррарӣ ва ҳам
The quick brown fox jumps over the lazy ox.
ҳамчун матни воридотӣ истифода мебарад.
RegexDemo
Матнро барои мувофиқатҳое, ки бо ҳар гуна аломат сар шуда, бо тамом мешаванд, ҷустуҷӯ мекунад
ox.
. Натиҷаҳои иҷрои он чунинанд:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Дар баромад мо ду мувофиқатро мебинем:
fox
ва
ox
(бо аломати фосила дар пеши он). Метааломат
.
бо аломат
f
дар ҳолати аввал ва фосила дар ҳолати дуюм мувофиқат мекунад. Агар шумо онро
.ox
бо мета аломат иваз кунед, чӣ мешавад
.
? Яъне он чизе ки мо дар натиҷаи сатри фармони зерин ба даст меорем:
java RegexDemo . "The quick brown fox jumps over the lazy ox."
Азбаски мета аломати нуқта ба ҳама гуна аломат мувофиқат мекунад,
RegexDemo
мувофиқатҳоеро, ки барои ҳама аломатҳо (аз ҷумла аломати нуқтаи паси) матни воридотӣ ёфтаанд, мебарорад:
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Мета аломатҳои иқтибос |
Барои муайян кардан . ё ягон мета аломати дигар ҳамчун аломати аслӣ дар сохтори ифодаи муқаррарӣ, шумо бояд аз он бо яке аз роҳҳои зерин гурезед:
- пеш аз он бо аломати баръакс гузоред;
- Ин мета аломатро дар байни
\Q ва ҷойгир кунед \E (масалан, \Q.\E ).
Дар хотир доред, ки ҳама аломатҳоеро, ки дар сатри аслӣ пайдо мешаванд, такрор кунед, ба монанди String regex = "\\."; хатҳои баръакс (масалан, \\. ё \\Q.\\E ). Он хатҳои баръаксро, ки қисми аргументи сатри фармон мебошанд, такрор накунед. |
Синфҳои аломатҳо
Баъзан шумо бояд мувофиқатҳоеро, ки шумо ҷустуҷӯ мекунед, бо маҷмӯи мушаххаси аломатҳо маҳдуд кунед. Масалан, матнро барои садонокҳои
a
,
e
,
i
,
o
ва
u
, ҷустуҷӯ кунед, бо ҳар як вохӯрии ҳарфи садонок мувофиқат ҳисобида мешавад. Дар ҳалли чунин масъалаҳо ба мо синфҳои аломатҳо, ки маҷмӯи аломатҳоро байни метаҳарфаҳои қавсҳои мураббаъ муайян мекунанд, кӯмак хоҳанд кард (
[ ]
). Синф
Pattern
синфҳои оддии аломатҳо, синфҳои диапазон, баръакс, иттифоқ, буриш ва тарҳро дастгирӣ мекунад. Мо ҳоло ҳамаи онҳоро дида мебароем.
Синфҳои аломатҳои оддӣ
Синфи аломатҳои оддӣ аз аломатҳои паҳлӯ ба паҳлӯ ҷойгиршуда иборат аст ва танҳо ба он аломатҳо мувофиқат мекунад. Масалан, синф
[abc]
бо аломатҳои
a
,
b
ва
c
. Мисоли зеринро баррасӣ кунед:
java RegexDemo [csw] cave
Тавре ки шумо аз натиҷаҳо мебинед, дар ин мисол танҳо аломате
c
, ки барои он мувофиқат мавҷуд аст
cave
:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
Синфҳои аломатҳои баръакс
Синфи аломати инвертсионалӣ бо мета аломат оғоз мешавад
^
ва танҳо бо аломатҳои дар он мавҷудбуда мувофиқат мекунад. Масалан, синф
[^abc]
ба ҳама аломатҳо мувофиқат мекунад, ба истиснои
a
,
b
ва
c
. Мисоли зеринро дида бароед:
java RegexDemo "[^csw]" cave
Дар хотир доред, ки дар системаи оператсионии ман (Windows) нохунакҳои дукарата талаб карда мешаванд, зеро қабат ба онҳо
^
ҳамчун аломати фирорӣ муносибат мекунад. Тавре ки шумо мебинед, дар ин мисол танҳо аломатҳои
a
,
v
ва ёфт шуданд
e
, ки барои онҳо мувофиқатҳо дар
cave
:
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3
Синфҳои аломатҳои диапазон
Синфи аломатҳои диапазон аз ду аломат иборат аст, ки бо дефис (
-
) ҷудо шудаанд. Ҳама аломатҳо, ки аз аломати дар тарафи чапи дефис сар карда ва бо аломати рост ба охир мерасад, қисми диапазон мебошанд. Масалан, диапазон
[a-z]
ба ҳама ҳарфҳои хурди лотинӣ мувофиқат мекунад. Ин ба таърифи синфи оддӣ баробар аст
[abcdefghijklmnopqrstuvwxyz]
. Мисоли зеринро дида бароед:
java RegexDemo [a-c] clown
Ин мисол танҳо бо аломате мувофиқат мекунад,
c
ки дар
clown
:
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Ифодаҳои муқаррарӣ дар Java, Қисми 2 Ифодаҳои муқаррарӣ дар Java, Қисми 3 Ифодаҳои муқаррарӣ дар Java, Қисми 4 Ифодаҳои муқаррарӣ дар Java, Қисми 5
GO TO FULL VERSION