JavaRush /Блоги Java /Random-TG /Ифодаҳои муқаррарӣ дар Java, Қисми 1

Ифодаҳои муқаррарӣ дар Java, Қисми 1

Дар гурӯҳ нашр шудааст
Мо ба таваҷҷуҳи шумо тарҷумаи дастури кӯтоҳро оид ба ибораҳои муқаррарӣ ба забони Java пешкаш менамоем, ки аз ҷониби Ҷефф Фризен барои вебсайти JavaWorld навишта шудааст . Барои осонии хондан, мо мақоларо ба чанд қисм тақсим кардем. Ифодаҳои муқаррарӣ дар Java, Қисми 1 - 1

Истифодаи 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;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      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 табдил медиҳад. Ифодаҳои муқаррарӣ дар Java, Қисми 1 - 2Қисми асосии 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. Ифодаҳои муқаррарӣ дар Java, Қисми 1 - 3

Метааломатҳо

Конструкцияҳои ҷолибтари ифодаи муқаррарӣ аломатҳои аслиро бо мета аломатҳо муттаҳид мекунанд. Масалан, дар ифодаи муқаррарӣ 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
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION