Mund të provoni diçka të tillë:
final Pattern pattern = Pattern.compile("^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*RESOLUTION=([\\dx]+).*");
Matcher matcher = pattern.matcher("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234");
String bandwidth = "";
String resolution = "";
if (matcher.find()) {
bandwidth = matcher.group(1);
resolution = matcher.group(2);
}
Do të vendosë gjerësinë e brezit dhe rezolucionin në vlerat e sakta (String).
Nuk e kam provuar këtë në një pajisje ose emulator android, por duke gjykuar nga lidhja që dërgove dhe API-ja e androidit, duhet të funksionojë njësoj si java e vjetër e mësipërme.
Regex përputhet me vargjet që fillojnë me #EXT-X-STREAM-INF:
dhe përmban BANDWIDTH
dhe RESOLUTION
të ndjekur nga formatet e sakta të vlerave. Këto më pas referohen prapa në grupin e referencës 1 dhe 2, në mënyrë që ne t'i nxjerrim ato.
Redakto:
Nëse RESOLUTION nuk është gjithmonë i pranishëm, atëherë mund ta bëni atë pjesë opsionale si të tillë:
"^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*(?:RESOLUTION=([\\dx]+))?.*"
Vargu resolution
do të ishte null
në rastet kur është i pranishëm vetëm BANDWIDTH
.
Redakto2:
?
i bën gjërat opsionale, dhe (?:___)
do të thotë një grup pasiv (në krahasim me një grup referues prapa (___)
. Pra, është në thelb një grup pasiv opsional. Pra, po, çdo gjë brenda tij do të jetë opsionale.
Një .
përputhet me një karakter të vetëm, dhe një *
do të thotë se do të përsëritet zero ose më shumë herë. Pra, .*
do të përputhet me zero ose më shumë karaktere. Arsyeja pse na duhet kjo është që të konsumojmë çdo gjë midis asaj që po përputhemi, p.sh. çdo gjë ndërmjet #EXT-X-STREAM-INF:
dhe BANDWIDTH
. Ka shumë mënyra për ta bërë këtë, por .*
është më e përgjithshme/e gjerë.
\d
është në thelb një grup karakteresh që përfaqësojnë numrat (0-9
), por meqenëse e përcaktojmë vargun si një varg Java, na duhet dyfishi \\
, përndryshe përpiluesi Java do të dështojë sepse nuk e njeh karakterin e arratisur \d
(në Java) . Në vend të kësaj, ai do të analizojë \\
në \
në mënyrë që të marrim \d
në vargun përfundimtar të kaluar te konstruktori Pattern
.
[\dx]+
do të thotë një ose më shumë karaktere (+
) nga karakteret 0-9
dhe x
. [\dx\d]
do të ishte një karakter i vetëm (jo +
) nga i njëjti grup karakteresh.
Nëse jeni të interesuar për regex, mund të shikoni regular-expressions.info ose/dhe < një href="http://regexone.com/" rel="noreferrer">regexone.com, aty do të gjeni përgjigje shumë më të thella për të gjitha pyetjet tuaja.
07.03.2013
pattern.matcher
çfarë saktësisht kthen nëmatcher
a është vargu që e lë patentën e dhënë në shprehjen e rregullt? pasi kemi bërëpattern.matcher
pse po thërrasimfind
? 07.03.2013find()
do të përpiqet të gjejë përputhjen e radhës në vargun e dhënë, nëse gjen një, ai kthehet i vërtetë dhe ne mund ta nxjerrim rezultatin. Mund t'i hidhni një sy dokumentacioni për më shumë informacion (ky është dokumentacioni Java, por duhet të sillet në të njëjtën mënyrë në Android, dokumenti android nuk kishte shumë detaje në të). 07.03.2013find
po dështon në atë rast. a mund të jetë e mundur të kontrollohet për RESOLUTION në secilin rast nëse gjendet, atëherë në rregull, përndryshe thjesht injoro ose duhet të kemi shprehje të veçanta për analizimin e gjerësisë së brezit dhe rezolucionit dhe t'u kalojmë të njëjtin varg të dyve dhe të thërrasim gjetjen? 07.03.2013(?:___)?
do të jetë fakultative apo jo? dhe gjithashtu për çfarë përdoret.*
dhe pse \\ dhe gjithashtu pse është[\\dx]+
dhe jo[\\dx\\d]
më falni nëse po bëj kaq shumë pyetje :) më falni për këtë. 07.03.2013#EXTINF:10, no desc
. regexp im është si^#EXTINF:(\\d+),$
pormatcher.find()
im është gjithmonë false në këtë rast, a është e drejtë regexp im? 08.03.2013