Log4j基本上已¾l是java里的首选日志工具了åQŒå®ƒä¸»è¦ç”׃¸‰éƒ¨åˆ†¾l„æˆåQšLoggers, Appenderså’ŒLayouts (注æ„åŽé¢éƒ½åŠ äº†s啦,™å‘Öæ€ä¹‰ä¸€ä¸ªé…¾|®ä¸å¯ä»¥åˆ†åˆ«å…许有多个椾cÕd¯¹è±¡å˜åœ¨ï¼ŒåŽé¢ž®†è¯¦¾l†ä»‹¾l?ã€?br />
LoggersåQ用æ¥å®šä¹‰æ—¥å¿—消æ¯çš„¾cÕdž‹åŠçñ”别;
AppendersåQ用æ¥å®šä¹‰æ—¥å¿—消æ¯çš„输出¾lˆç«¯åQ?br />
LayoutsåQ用æ¥å®šä¹‰æ—¥å¿—消æ¯çš„è¾“å‡ºæ ¼å¼ã€?/span>
Logger
Loggers层次åQ?br />
å¯?span style="font-family: ">loggerçš„åå—æ˜¯å¤§å°å†™æ•感ã€?/span>
规则åQ如果类Pçš„åå—æ˜¯å¦ä¸€ä¸ªç±»Cçš„åå—çš„å‰ç¼€åQŒä¸”P与C之间ä»?#8220;.”寂¿žæŽ¥è“væ¥ï¼Œé‚£ä¹ˆ¿U°P为祖先层‹Æ¡ï¼›å¦‚果层次A与其å层‹Æ¡ä¹‹é—´æ²¡æœ‰ä“Q何父层次åQŒåˆ™è®¤äؓ层次A为父层次ã€?/span> |
例如åQŒorg.apache.log4j是org.apache.log4j.Logger的父层次åQ›è€Œorg.apache是org.apache.log4j与org.apache.log4j.Logger的祖先层‹Æ¡ã€?/span>
å¦å¤–åQŒæ³¨æ„log4j䏿œ‰ä¸ªé»˜è®¤çš„root¾U§åˆ«çš„loggeråQŒåœ¨æ‰€æœ‰loggerä¸ï¼Œå®ƒæ˜¯æœ€é«˜çñ”别,其它所有loggerå‡ç‘ô承于rootåQŒroot有以下二个特性:
1. 它æ€ÀL˜¯å˜åœ¨çš„ã€?br />
2. 它ä¸èƒ½é€šè¿‡åå—直接获å–其实ä¾?root实例å¯ä»¥é€šè¿‡¾c»Loggerçš„é™æ€æ–¹æ³•Logger.getRootLogger获得åQŒè€Œå…¶å®ƒlogger则å¯ä»¥ç›´æŽ¥é€šè¿‡åå—æ¥èŽ·å–Logger.getLogger)ã€?/span>
关于Loggersä¸çš„¾U§åˆ«åQ?/span>
å¯ÒŽ¯ä¸ªloggeråQŒå¯ä»¥æŒ‡å®šå…¶¾U§åˆ«åQŒåœ¨¾pÈ»Ÿorg.apache.log4j.Levelä¸ï¼Œå·²ç»å®šä¹‰äº†äº”个çñ”别,分别为debug, info, warn, error, fatalã€?/span>
规则åQ设当å‰logger为XåQŒä»ŽX开始往X的父¾cÀL–¹å‘开始算(包括X本èín)åQŒç›´åˆ°å为rootçš„loggeråQŒç¬¬ä¸€ä¸ªä¸ä¸ºnullçš„çñ”别值就是Xçš„çñ”别倹{€?/span> |
日志昄¡¤ºåQ?/span>
¾U§åˆ«çš„定义是ä¸ÞZº†˜q‡æ×o性地选择日志ã€?/span>
规则åQ若当å‰è¯äh–¹å¼çñ”åˆ«äØ“PåQŒè€Œå½“å‰çš„loggerçš„çñ”åˆ«äØ“QåQŒå½“且仅当在P>=Q的情况下åQŒæ—¥å¿—ä¿¡æ¯æ‰èƒ½æ˜¾½Cºã€?/span> |
DEBUG < INFO < WARN < ERROR < FATAL
�br />
关于æ¤è§„则的说明åQŒæœ‰ä»¥ä¸‹ä»£ç 为实例:
// get a logger instance named "com.foo" Logger logger = Logger.getLogger("com.foo"); // Now set its level. Normally you do not need to set the // level of a logger programmatically. This is usually done // in configuration files. logger.setLevel(Level.INFO); Logger barlogger = Logger.getLogger("com.foo.Bar"); // This request is enabled, because WARN >= INFO. logger.warn("Low fuel level."); // This request is disabled, because DEBUG < INFO. logger.debug("Starting search for nearest gas station."); // The logger instance barlogger, named "com.foo.Bar", // will inherit its level from the logger named // "com.foo" Thus, the following request is enabled // because INFO >= INFO. barlogger.info("Located nearest gas station."); // This request is disabled, because DEBUG < INFO. barlogger.debug("Exiting gas station search"); |
Appenders与Layouts
Appenderæ£å¦‚å‰é¢æ‰€˜qŽÍ¼Œæ˜¯ç”¨æ¥å®šä¹‰æ—¥å¿—ä¿¡æ¯çš„输出¾lˆç«¯åQŒæœ€è§‰çš„输出¾lˆç«¯æœ‰console与file了,å¦å¤–˜q˜æœ‰å…¶å®ƒå¦‚GUI components, JMS, NT Event Loggers, remote socket servers½{‰ç‰ã€?/span>
Appender也有¾cÖM¼¼¾l§æ‰¿çš„原则,å›_½“å‰loggerçš„appender包括其它父类的appenderã€‚è¿™æ ·å°±ä¼šå‡ºçŽîC¸€ä¸ªloggerå¯èƒ½æ‹¥æœ‰å¤šä¸ªappender了,在现实ä¸çœ‹æ¥åQŒå°±æ˜¯log4j的日志信æ¯å¯ä»¥åŒ˜q›è¾“出到console, file½{‰ç‰¾lˆç«¯äº†ã€‚当ç„Óž¼Œä¸ÞZº†ä¸ä‹Éæ¤appenderæ¶æ€§å åŠ ï¼Œå¯ä»¥é€šè¿‡è®„¡½®additivityæ ‡å¿—æ¥é˜»æ¢ç‘ôæ‰Ñ€?/span>
规则åQ若当å‰logger为CåQŒåˆ™C拥有包括其自己åŠå…¶çˆ¶¾cÈš„所有appender。å¦å¤–,若C的父logger为PåQŒä¸”Pçš„additivityæ ‡å¿—å·²ç»è®„¡½®æˆäØ“falseåQŒåˆ™Cåªæ‹¥æœ‰è‡ªå·±åŠPçš„appender了,而P则åªèƒ½æ‹¥æœ‰æœ¬íw«çš„appenderã€?/span>
ä»¥ä¸‹è¡¨æ ¼å¯ä»¥æ¸…晰说明æ¤è§„则:
Logger
Name
Added
Appenders
Additivity
Flag
Output Targets
Comment
root
A1
not applicable
A1
The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.
x
A-x1, A-x2
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y
none
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y.z
A-xyz1
true
A1, A-x1, A-x2, A-xyz1
Appenders in "x.y.z", "x" and root.
security
A-sec
false
A-sec
No appender accumulation since the additivity flag is set to false
.
security.access
none
true
A-sec
Only appenders of "security" because the additivity flag in "security" is set to
false
.
对于layoutåQŒä¹Ÿæ£å¦‚å‰é¢æ‰€˜qŽÍ¼Œæ˜¯ç”¨æ¥å®šä¹‰æ—¥å¿—ä¿¡æ¯çš„è¾“å‡ºæ ¼å¼åQŒå®ƒçš„与Cè¯è¨€ä¸?/span>printf
å‡½æ•°çš„æ ¼å¼å®šä¹‰åŸºæœ¬ç›¸ä¼û|¼Œæœ¬äh对printfä¸çš„æ ¼å¼å‚æ•°ä¸å¤ªç†Ÿæ‚‰åQŒæ€ÀL„Ÿè§‰æœ‰äº›å¤æ‚,一般是òqÏx—¶çœ‹åˆ°è‡ªå·±è®¤äØ“æœ‰ç”¨çš„æ ¼å¼å°±è®îC¸€ä¸‹ï¼Œåˆ°æ—¶ç›´æŽ¥æ¬è¿‡æ¥ã€‚如
log4j.appender.R.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n
æ—Óž¼Œæ—¥å¿—ä¿¡æ¯æ ¼å¼ä¸ºï¼š
--->2008-07-11 01:13:40 [ INFO]com.test.Log4jTest.main(Log4jTest.java:27) - Exiting application.
好啦åQŒçŽ°åœ¨log4jçš„ç†è®ºå¾ˆè‚¤æµ…地扯了一下,现在å¯ä»¥å¼€å§‹é…¾|®äº†ã€?/span>
é…ç½®åQ?/strong>
Log4j的酾|®å¯ä»¥é€šè¿‡åŠ è²Javaçš„propertiesé…置文äšg或者XMLæ–‡äšgæ¥å®Œæˆã€?br />
Log4j默认的酾|®äØ“åQŒé€šè¿‡è¯Õd–¾pÈ»Ÿå˜é‡log4j.configurationæ¥æ‰¾åˆ°é…¾|®æ–‡ä»Óž¼Œå½“ç„¶å˜é‡çš„默认å€égØ“log4j.propertiesåQŒæ‰€ä»¥è‹¥æ²¡æœ‰è®„¡½®æ¤ç³»¾lŸå˜é‡ï¼Œå¯ä»¥ç›´æŽ¥ž®†é…¾|®æ–‡ä»¶å‘½å䨓log4j.propertiesåQŒç„¶åŽæ”¾åˆ°ç±»è·¯å¾„下å³å¯ã€‚å¦å¤–,若想引用通过其它é…置文äšgåQŒåˆ™å¯ä»¥é€šè¿‡
Loader.getResource(java.lang.String)æ¥è¯»å–指定的é…置文äšgã€?/span>
其它åQ?/span>
1. ç”׃ºŽæœ‰äº†log4jä¸çš„¾U§åˆ«¾l§æ‰¿æœºåˆ¶åQŒæ‰€ä»¥å¯ä»¥å¾ˆæ–¹ä¾¿åœ°è¿‡æ»¤ä¿¡æ¯äº†åQŒä¸ä»…å¯ä»¥å¾ˆæ–¹ä¾¿åœ°é™åˆ¶æ—¥å¿—的输出é‡ï¼Œä¹Ÿå¯ä»¥åŒæ—¶å°†æ—¥å¿—输出åˆîC¸åŒçš„¾lˆç«¯ã€?br />
å¦å¤–åQŒå› 为在javaæ–‡äšgä¸ï¼Œæ–‡äšg的物ç†å±‚‹Æ¡å…³¾pÖM¹Ÿæ˜¯ç›´æŽ¥é€šè¿‡“.”½W¦å·æ¥æŽ§åˆ¶çš„åQŒä¸”在很在程度上˜q™ä¸ªç‰©ç†å±‚次也决定了文äšg的逻辑层次åQŒæ‰€ä»¥æˆ‘ä»¬åœ¨å½“å‰æ–‡äšgä¸èŽ·å–loggeræ—Óž¼Œå¯ä»¥ç›´æŽ¥é€šè¿‡å½“剿–‡äšgçš„ç±»åæ¥èŽ·å–åQŒå¦‚åQ?br />
static Logger logger = Logger.getLogger(MyApp.class);
˜q™æ ·åQŒåœ¨˜q‡æ×oæ¶ˆæ¯æ—¶å°±å¾ˆç®€å•了åQŒç®€å•示例如下:
在酾|®æ–‡ä»¶ä¸æœ?br />
log4j.rootLogger=ERROR,stdout,R
log4j.category.com.db=DEBUG
log4j.category.com.i18n=INFO
log4j.category.com.zyx=fatal
默认的root logger的日志çñ”åˆ«äØ“ErroråQŒæ ¹æ®çñ”别关¾p»è¿™ä¸ªçñ”别也相当高了åQŒè¿™æ ·å¯ä»¥å‡ž®‘ç³»¾lŸä¸æ—¥å¿—的输出é‡åQŒä½†æœ‰äº›åœ°æ–¹å¯èƒ½å¾—输出更详细信æ¯åQŒå¦‚æ•°æ®åº“部分,所以å¯ä»¥å°†com.db讄¡½®æˆäº†debug。å¦å¤–,我在com.zyxä¸‹ï¼Œæˆ‘åªæƒ³çœ‹åˆ°ç±»åž‹äØ“fatal的日志,也å¯ä»¥å¦‚上所设ã€?/span>
2. log4j.rootLogger=ERROR,stdout, ROLLING_FILE˜q™ä¸ªå®šä¹‰è¡?/span>½Cºroot logger的日志çñ”åˆ«äØ“ErroråQŒåŽé¢çš„stdout, ROLLING_FILE表示æ¤root有二个appenderåQŒé€šå¸¸å¯ä»¥é€šè¿‡˜q™æ ·æ¥å®šä¹‰æ—¥å¿—å¯ä»¥åŒæ—¶å‘多个¾lˆç«¯è¾“出åQŒå› 为åloggerå¯ä»¥¾l§æ‰¿æ‰€æœ‰çˆ¶loggerçš„appender.
如我å¯ä»¥é€šè¿‡ä»¥ä¸‹å®šä¹‰ž®†æ—¥å¿—åŒæ—¶å¾€consoleåŠfile输出åQ?/span>
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.File=myapp.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=1024KB log4j.appender.ROLLING_FILE.MaxBackupIndex=10 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern==[slf5s.start]%d{DATE}[slf5s.DATE]%n" %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n" %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n |
马马虎虎æ€È»“了一下,但也èŠÞp´¹äº†äºŒä¸ªå¤šž®æ—¶åQŒå‘µå‘µï¼
许多è¯è¨€åQŒåŒ…括Perlã€PHPã€Pythonã€JavaScriptå’ŒJScriptåQŒéƒ½æ”¯æŒç”¨æ£åˆ™è¡¨è¾‘Ö¼å¤„ç†æ–‡æœ¬åQŒä¸€äº›æ–‡æœ¬ç¼–辑器用æ£åˆ™è¡¨è¾‘ּ实现高çñ”“æœçƒ¦-替梔功能。那么Javaåˆæ€Žæ ·å‘¢ï¼Ÿæœ¬æ–‡å†™ä½œæ—Óž¼Œä¸€ä¸ªåŒ…å«äº†ç”¨æ£åˆ™è¡¨è¾‘Ö¼˜q›è¡Œæ–‡æœ¬å¤„ç†çš„Java规范需求(Specification RequeståQ‰å·²¾l得到认å¯ï¼Œä½ å¯ä»¥æœŸå¾…在JDK的下一版本ä¸çœ‹åˆ°å®ƒã€?/td> |
然而,如果现在ž®±éœ€è¦ä‹É用æ£åˆ™è¡¨è¾‘Ö¼åQŒåˆè¯¥æ€Žä¹ˆåŠžå‘¢åQŸä½ å¯ä»¥ä»ŽApache.orgä¸‹è²æºä»£ç 开攄¡š„Jakarta-ORO库。本文接下æ¥çš„内容先½Ž€è¦åœ°ä»‹ç»æ£åˆ™è¡¨è¾¾å¼çš„入门知识åQŒç„¶åŽä»¥Jakarta-ORO APIä¸ÞZ¾‹ä»‹ç»å¦‚何使用æ£åˆ™è¡¨è¾¾å¼ã€?/td> |
ä¸€ã€æ£åˆ™è¡¨è¾‘ּ基础知识 |
我们先从½Ž€å•的开始。å‡è®¾ä½ è¦æœç´¢ä¸€ä¸ªåŒ…å«å—½W?#8220;cat”的嗽W¦ä¸²åQŒæœç´¢ç”¨çš„æ£åˆ™è¡¨è¾‘Ö¼ž®±æ˜¯“cat”。如果æœç´¢å¯¹å¤§å°å†™ä¸æ•感åQŒå•è¯?#8220;catalog”ã€?#8220;Catherine”ã€?#8220;sophisticated”都å¯ä»¥åŒ¹é…。也ž®±æ˜¯è¯ß_¼š |
![]() |
1.1 å¥ç‚¹½W¦å· |
å‡è®¾ä½ åœ¨çŽ©è‹±æ–‡æ‹¼å—æ¸¸æˆï¼ŒæƒŒ™¦æ‰‘Ö‡ºä¸‰ä¸ªå—æ¯çš„å•è¯ï¼Œè€Œä¸”˜q™äº›å•è¯å¿…é¡»ä»?#8220;t”å—æ¯å¼€å¤ß_¼Œä»?#8220;n”å—æ¯¾l“æŸã€‚å¦å¤–,å‡è®¾æœ‰ä¸€æœ¬è‹±æ–‡å—å…¸ï¼Œä½ å¯ä»¥ç”¨æ£åˆ™è¡¨è¾¾å¼æœç´¢å®ƒçš„全部内å®V€‚è¦æž„é€ å‡º˜q™ä¸ªæ£åˆ™è¡¨è¾¾å¼ï¼Œä½ å¯ä»¥ä‹É用一个通酽W¦â€”—å¥ç‚¹ç¬¦å?#8220;.”ã€‚è¿™æ øP¼Œå®Œæ•´çš„表辑ּž®±æ˜¯“t.n”åQŒå®ƒåŒšw…“tan”ã€?#8220;ten”ã€?#8220;tin”å’?#8220;ton”åQŒè¿˜åŒšw…“t#n”ã€?#8220;tpn”甚至“t n”åQŒè¿˜æœ‰å…¶ä»–è®¸å¤šæ— æ„义的组åˆã€‚è¿™æ˜¯å› ä¸ºå¥ç‚¹ç¬¦å·åŒ¹é…所有嗽W¦ï¼ŒåŒ…括½Iºæ ¼ã€Tabå—符甚至æ¢è¡Œ½W¦ï¼š |
![]() |
1.2 æ–ÒŽ‹¬åïL¬¦å?/strong> |
ä¸ÞZº†è§£å†³å¥ç‚¹½W¦å·åŒšw…范围˜q‡äºŽòq¿æ³›˜q™ä¸€é—®é¢˜åQŒä½ å¯ä»¥åœ¨æ–¹æ‹¬å·åQ?#8220;[]”åQ‰é‡Œé¢æŒ‡å®šçœ‹æ¥æœ‰æ„义的嗽W¦ã€‚æ¤æ—Óž¼Œåªæœ‰æ–ÒŽ‹¬å·é‡Œé¢æŒ‡å®šçš„å—符æ‰å‚与匹é…。也ž®±æ˜¯è¯ß_¼Œæ£åˆ™è¡¨è¾¾å¼?#8220;t[aeio]n”åªåŒ¹é…?#8220;tan”ã€?#8220;Ten”ã€?#8220;tin”å’?#8220;ton”。但“Toon”ä¸åŒ¹é…ï¼Œå› äØ“åœ¨æ–¹æ‹¬å·ä¹‹å†…ä½ åªèƒ½åŒ¹é…å•个嗽W¦ï¼š |
![]() |
1.3 “æˆ?#8221;½W¦å· |
如果除了上é¢åŒšw…的所有å•è¯ä¹‹å¤–ï¼Œä½ è¿˜æƒŒ™¦åŒšw…“toon”åQŒé‚£ä¹ˆï¼Œä½ å¯ä»¥ä‹Éç”?#8220;|”æ“作½W¦ã€?#8220;|”æ“作½W¦çš„基本æ„义ž®±æ˜¯“æˆ?#8221;˜q算。è¦åŒšw…“toon”åQŒä‹Éç”?#8220;t(a|e|i|o|oo)n”æ£åˆ™è¡¨è¾¾å¼ã€‚这里ä¸èƒ½ä‹É用方扩å·åQŒå› 为方括å·åªå…许匹é…å•个嗽W¦ï¼›˜q™é‡Œå¿…须使用圆括å?#8220;()”。圆括巘q˜å¯ä»¥ç”¨æ¥åˆ†¾l„,具体请å‚è§åŽé¢ä»‹¾lã€?/td> |
![]() |
1.4 表示匚w…‹Æ¡æ•°çš„符å?/strong> |
表一昄¡¤ºäº†è¡¨½CºåŒ¹é…次数的½W¦å·åQŒè¿™äº›ç¬¦åïL”¨æ¥ç¡®å®šç´§é 该½W¦å·å·¦è¾¹çš„符å·å‡ºçŽ°çš„‹Æ¡æ•°åQ?/td> |
|
å‡è®¾æˆ‘们è¦åœ¨æ–‡æœ¬æ–‡äšg䏿œç´¢ç¾Žå›½çš„½C¾ä¼šå®‰å…¨åïL 。这个å·ç çš„æ ¼å¼æ˜?99-99-9999。用æ¥åŒ¹é…它的æ£åˆ™è¡¨è¾‘ּ如图一所½Cºã€‚在æ£åˆ™è¡¨è¾¾å¼ä¸åQŒè¿žå—符åQ?#8220;-”åQ‰æœ‰ç€ç‰ÒŽ®Šçš„æ„ä¹‰ï¼Œå®ƒè¡¨½CÞZ¸€ä¸ªèŒƒå›ß_¼Œæ¯”如ä»?åˆ?ã€‚å› æ¤ï¼ŒåŒšw…½C¾ä¼šå®‰å…¨åïL ä¸çš„˜qžå—½W¦å·æ—Óž¼Œå®ƒçš„å‰é¢è¦åŠ ä¸Šä¸€ä¸ªè{义嗽W?#8220;\”ã€?/td> |
|
图一åQšåŒ¹é…所æœ?23-12-1234å½¢å¼çš„社会安全å·ç ?/p> |
å‡è®¾˜q›è¡Œæœçƒ¦çš„æ—¶å€™ï¼Œä½ 希望连å—符å·å¯ä»¥å‡ºçŽŽÍ¼Œä¹Ÿå¯ä»¥ä¸å‡ºçŽ°â€”â€”å³åQ?99-99-9999å’?99999999都属于棼‹®çš„æ ¼å¼ã€‚è¿™æ—Óž¼Œä½ å¯ä»¥åœ¨˜qžå—½W¦å·åŽé¢åŠ ä¸Š“åQ?#8221;æ•°é‡é™å®š½W¦å·åQŒå¦‚图二所½Cºï¼š |
|
图二åQšåŒ¹é…所æœ?23-12-1234å’?23121234å½¢å¼çš„社会安全å·ç ?/p> |
䏋颿ˆ‘们冿¥çœ‹å¦å¤–一个例å。美国汽车牌照的一¿Uæ ¼å¼æ˜¯å››ä¸ªæ•°å—åŠ ä¸ŠäºŒä¸ªå—æ¯ã€‚它的æ£åˆ™è¡¨è¾‘Ö¼å‰é¢æ˜¯æ•°å—部åˆ?#8220;[0-9]{4}”åQŒå†åŠ ä¸Šå—æ¯éƒ¨åˆ†“[A-Z]{2}”。图三显½CÞZº†å®Œæ•´çš„æ£åˆ™è¡¨è¾‘Ö¼ã€?/td> |
|
图三åQšåŒ¹é…典型的¾ŸŽå›½æ±½èžR牌照åïL åQŒå¦‚8836KV |
1.5 “å?#8221;½W¦å· |
“^”½W¦å·¿UîCØ““å?#8221;½W¦å·ã€‚如果用在方括å·å†…,“^”è¡¨ç¤ºä¸æƒ³è¦åŒ¹é…çš„å—符。例如,囑֛›çš„æ£åˆ™è¡¨è¾‘Ö¼åŒšw…所有å•è¯ï¼Œä½†ä»¥“X”å—æ¯å¼€å¤´çš„å•è¯é™¤å¤–ã€?/td> |
|
囑֛›åQšåŒ¹é…所有å•è¯ï¼Œä½?#8220;X”开头的除外 |
1.6 圆括å·å’Œ½Iºç™½½W¦å· |
å‡è®¾è¦ä»Žæ ¼å¼ä¸?#8220;June 26, 1951”çš„ç”Ÿæ—¥æ—¥æœŸä¸æå–出月份部分,用æ¥åŒšw…该日期的æ£åˆ™è¡¨è¾¾å¼å¯ä»¥å¦‚图五所½Cºï¼š |
|
图五åQšåŒ¹é…所有Moth DD,YYYYæ ¼å¼çš„æ—¥æœ?/p> |
新出现的“\s”½W¦å·æ˜¯ç©ºç™½ç¬¦åøP¼ŒåŒšw…所有的½Iºç™½å—符åQŒåŒ…括Tabå—符。如果嗽W¦ä¸²æ£ç¡®åŒšw…åQŒæŽ¥ä¸‹æ¥å¦‚何æå–出月份部分呢åQŸåªéœ€åœ¨æœˆä»½å‘¨å›´åŠ ä¸Šä¸€ä¸ªåœ†æ‹¬å·åˆ›å¾ä¸€ä¸ªç»„åQŒç„¶åŽç”¨ORO APIåQˆæœ¬æ–‡åŽé¢è¯¦¾l†è®¨è®ºï¼‰æå–出它的倹{€‚修改åŽçš„æ£åˆ™è¡¨è¾‘Ö¼å¦‚å›¾å…æ‰€½Cºï¼š |
|
囑օåQšåŒ¹é…所有Month DD,YYYYæ ¼å¼çš„æ—¥æœŸï¼Œå®šä¹‰æœˆä†¾å€égØ“½W¬ä¸€ä¸ªç»„ |
1.7 其它½W¦å· |
为简便è“vè§ï¼Œä½ å¯ä»¥ä‹Éç”¨ä¸€äº›äØ“å¸¸è§æ£åˆ™è¡¨è¾¾å¼åˆ›å»ºçš„å¿«æ·½W¦å·ã€‚如表二所½Cºï¼š |
表二åQšå¸¸ç”¨ç¬¦å?/td> |
|
例如åQŒåœ¨å‰é¢½C¾ä¼šå®‰å…¨åïL 的例åä¸åQŒæ‰€æœ‰å‡ºçŽ?#8220;[0-9]”的地æ–ÒŽˆ‘们都å¯ä»¥ä½¿ç”¨“\d”。修改åŽçš„æ£åˆ™è¡¨è¾‘Ö¼å¦‚å›¾ä¸ƒæ‰€½Cºï¼š |
|
图七åQšåŒ¹é…所æœ?23-12-1234æ ¼å¼çš„社会安全å·ç ?/p> |
二ã€Jakarta-OROåº?/font> |
有许多æºä»£ç 开攄¡š„æ£åˆ™è¡¨è¾¾å¼åº“å¯ä¾›Java½E‹åºå‘˜ä‹É用,而且它们ä¸çš„许多支æŒPerl 5兼容的æ£åˆ™è¡¨è¾‘Ö¼è¯æ³•。我在这里选用的是Jakarta-OROæ£åˆ™è¡¨è¾¾å¼åº“åQŒå®ƒæ˜¯æœ€å…¨é¢çš„æ£åˆ™è¡¨è¾‘Ö¼API之一åQŒè€Œä¸”它与Perl 5æ£åˆ™è¡¨è¾¾å¼å®Œå…¨å…¼å®V€‚å¦å¤–,它也是优化得最好的API之一ã€?/td> |
Jakarta-ORO库以å‰å«åšOROMatcheråQŒDaniel Savareseå¤§æ–¹åœ°æŠŠå®ƒèµ é€ç»™äº†Jakarta Projectã€‚ä½ å¯ä»¥æŒ‰ç…§æœ¬æ–‡æœ€åŽå‚考资æºçš„说明下è²å®ƒã€?/td> |
我首先将½Ž€è¦ä»‹¾lä‹É用Jakarta-OROåº“æ—¶ä½ å¿…™åÕdˆ›å»ºå’Œè®‰K—®çš„对象,然åŽä»‹ç»å¦‚何使用Jakarta-ORO APIã€?/td> |
�PatternCompiler对象 |
首先åQŒåˆ›å»ÞZ¸€ä¸ªPerl5Compiler¾cÈš„实例åQŒåƈ把它赋值给PatternCompiler接å£å¯¹è±¡ã€‚Perl5Compiler是PatternCompiler接å£çš„一个实玎ͼŒå…è®¸ä½ æŠŠæ£åˆ™è¡¨è¾¾å¼ç¼–译æˆç”¨æ¥åŒšw…çš„Pattern对象ã€?/td> |
![]() |
�Pattern对象 |
è¦æŠŠæ£åˆ™è¡¨è¾¾å¼ç¼–译æˆPattern对象åQŒè°ƒç”¨compiler对象的compile()æ–ÒŽ³•åQŒåÆˆåœ¨è°ƒç”¨å‚æ•îC¸æŒ‡å®šæ£åˆ™è¡¨è¾¾å¼ã€‚ä¾‹å¦‚ï¼Œä½ å¯ä»¥æŒ‰ç…§ä¸‹é¢è¿™¿Uæ–¹å¼ç¼–译æ£åˆ™è¡¨è¾‘Ö¼“t[aeio]n”åQ?/td> |
![]() |
默认情况下,¾~–译器创å»ÞZ¸€ä¸ªå¤§ž®å†™æ•感的模å¼ï¼ˆpatternåQ‰ã€‚å› æ¤ï¼Œä¸Šé¢ä»£ç ¾~–译得到的模å¼åªåŒšw…“tin”ã€?#8220;tan”ã€?“ten”å’?#8220;ton”åQŒä½†ä¸åŒ¹é…?#8220;Tin”å’?#8220;taN”。è¦åˆ›å¾ä¸€ä¸ªå¤§ž®å†™ä¸æ•感的模å¼åQŒä½ 应该在调用编译器的时候指定一个é¢å¤–çš„å‚æ•°åQ?/td> |
![]() |
创å¾å¥½Pattern对象之åŽåQŒä½ ž®±å¯ä»¥é€šè¿‡PatternMatcher¾cÈ”¨è¯¥Pattern对象˜q›è¡Œæ¨¡å¼åŒšw…ã€?/td> |
�PatternMatcher对象 |
PatternMatcher对象æ ÒŽ®Pattern对象和嗽W¦ä¸²˜q›è¡ŒåŒšw…‹‚€æŸ¥ã€‚ä½ è¦å®žä¾‹åŒ–一个Perl5Matcher¾cÕdƈ把结果赋值给PatternMatcher接å£ã€‚Perl5Matcher¾cÀL˜¯PatternMatcher接å£çš„一个实玎ͼŒå®ƒæ ¹æ®Perl 5æ£åˆ™è¡¨è¾¾å¼è¯æ³•进行模å¼åŒ¹é…: |
![]() |
使用PatternMatcher对象åQŒä½ å¯ä»¥ç”¨å¤šä¸ªæ–¹æ³•è¿›è¡ŒåŒ¹é…æ“作,˜q™äº›æ–ÒŽ³•çš„ç¬¬ä¸€ä¸ªå‚æ•°éƒ½æ˜¯éœ€è¦æ ¹æ®æ£åˆ™è¡¨è¾‘Ö¼˜q›è¡ŒåŒšw…的嗽W¦ä¸²åQ?/td> |
· boolean matches(String input, Pattern pattern)åQšå½“输入å—符串和æ£åˆ™è¡¨è¾¾å¼è¦¾_„¡¡®åŒšw…æ—¶ä‹É用。æ¢å¥è¯è¯ß_¼Œæ£åˆ™è¡¨è¾¾å¼å¿…™åÕd®Œæ•´åœ°æè¿°è¾“å…¥å—符丌Ӏ?/td> |
· boolean matchesPrefix(String input, Pattern pattern)åQšå½“æ£åˆ™è¡¨è¾¾å¼åŒ¹é…输入嗽W¦ä¸²èµ·å§‹éƒ¨åˆ†æ—¶ä‹É用ã€?/td> |
· boolean contains(String input, Pattern pattern)åQšå½“æ£åˆ™è¡¨è¾¾å¼è¦åŒšw…输入å—符串的一部分时ä‹É用(å»I¼Œå®ƒå¿…™åÀL˜¯ä¸€ä¸ªåä¸ÔŒ¼‰ã€?/td> |
å¦å¤–åQŒåœ¨ä¸Šé¢ä¸‰ä¸ªæ–ÒŽ³•调用ä¸ï¼Œä½ 还å¯ä»¥ç”¨PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°æ›¿ä»£String对象åQ›è¿™æ—Óž¼Œä½ å¯ä»¥ä»Žå—ç¬¦ä¸²ä¸æœ€åŽä¸€‹Æ¡åŒ¹é…çš„ä½ç½®å¼€å§‹ç‘ô¾l进行匹é…。当å—符串å¯èƒ½æœ‰å¤šä¸ªå串匚w…¾l™å®šçš„æ£åˆ™è¡¨è¾‘Ö¼æ—Óž¼Œç”¨PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°ž®±å¾ˆæœ‰ç”¨äº†ã€‚用PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°æ›¿ä»£Stringæ—Óž¼Œä¸Šè¿°ä¸‰ä¸ªæ–ÒŽ³•çš„è¯æ³•如下: |
· boolean matches(PatternMatcherInput input, Pattern pattern) |
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) |
· boolean contains(PatternMatcherInput input, Pattern pattern) |
三ã€åº”用实ä¾?/font> |
䏋颿ˆ‘们æ¥çœ‹çœ‹Jakarta-ORO库的一些应用实例ã€?/td> |
3.1 日志文äšgå¤„ç† |
ä»ÕdŠ¡åQšåˆ†æžä¸€ä¸ªWebæœåŠ¡å™¨æ—¥å¿—æ–‡ä»Óž¼Œ¼‹®å®šæ¯ä¸€ä¸ªç”¨æˆ¯‚Š±åœ¨ç½‘ç«™ä¸Šçš„æ—¶é—´ã€‚åœ¨å…¸åž‹çš„BEA WebLogic日志文äšgä¸ï¼Œæ—¥å¿—è®°å½•çš„æ ¼å¼å¦‚下: |
![]() |
分枘q™ä¸ªæ—¥å¿—记录åQŒå¯ä»¥å‘玎ͼŒè¦ä»Ž˜q™ä¸ªæ—¥å¿—æ–‡äšgæå–的内å®ÒŽœ‰ä¸¤é¡¹åQšIP地å€å’Œé¡µé¢è®¿é—®æ—¶é—´ã€‚ä½ å¯ä»¥ç”¨åˆ†¾l„符åøP¼ˆåœ†æ‹¬åøP¼‰ä»Žæ—¥å¿—记录æå–出IP地å€å’Œæ—¶é—´æ ‡è®°ã€?/td> |
首先我们æ¥çœ‹çœ‹IP地å€ã€‚IPåœ°å€æœ?个å—节构æˆï¼Œæ¯ä¸€ä¸ªå—节的值在0åˆ?55之间åQŒå„个å—节通过一个å¥ç‚¹åˆ†éš”ã€‚å› æ¤ï¼ŒIP地å€ä¸çš„æ¯ä¸€ä¸ªå—节有臛_°‘ä¸€ä¸ªã€æœ€å¤šä¸‰ä¸ªæ•°å—。图八显½CÞZº†ä¸ºIP地倾~–写的æ£åˆ™è¡¨è¾‘Ö¼åQ?/td> |
|
囑օ«åQšåŒ¹é…IPåœ°å€ |
IP地å€ä¸çš„å¥ç‚¹å—符必须˜q›è¡Œè½¬ä¹‰å¤„ç†åQˆå‰é¢åŠ ä¸?#8220;\”åQ‰ï¼Œå› 䨓IP地å€ä¸çš„å¥ç‚¹å…ähœ‰å®ƒæœ¬æ¥çš„å«ä¹‰åQŒè€Œä¸æ˜¯é‡‡ç”¨æ£åˆ™è¡¨è¾‘Ö¼è¯æ³•ä¸çš„ç‰ÒŽ®Šå«ä¹‰ã€‚å¥ç‚¹åœ¨æ£åˆ™è¡¨è¾¾å¼ä¸çš„特ŒDŠå«ä¹‰æœ¬æ–‡å‰é¢å·²¾l介¾lã€?/td> |
日志记录的时间部分由一å¯ÒŽ–¹æ‹¬å·åŒ…å›´ã€‚ä½ å¯ä»¥æŒ‰ç…§å¦‚下æ€èµ\æå–出方括å·é‡Œé¢çš„æ‰€æœ‰å†…容:首先æœçƒ¦èµ·å§‹æ–ÒŽ‹¬å·å—½W¦ï¼ˆ“[”åQ‰ï¼Œæå–出所有丑…过¾l“æŸæ–ÒŽ‹¬å·å—½W¦ï¼ˆ“]”åQ‰çš„内容åQŒå‘å‰å¯»æ‰„¡›´è‡Ïx‰¾åˆ°ç»“æŸæ–¹æ‹¬å·å—ç¬¦ã€‚å›¾ä¹æ˜¾½CÞZº†˜q™éƒ¨åˆ†çš„æ£åˆ™è¡¨è¾¾å¼ã€?/td> |
|
图ä¹åQšåŒ¹é…至ž®‘一个嗽W¦ï¼Œç›´è‡³æ‰‘Öˆ°“]” |
现在åQŒæŠŠä¸Šè¿°ä¸¤ä¸ªæ£åˆ™è¡¨è¾¾å¼åŠ ä¸Šåˆ†¾l„符åøP¼ˆåœ†æ‹¬åøP¼‰åŽåˆòq¶æˆå•个表达å¼ï¼Œ˜q™æ ·ž®±å¯ä»¥ä»Žæ—¥å¿—记录æå–出IP地å€å’Œæ—¶é—´ã€‚注æ„,ä¸ÞZº†åŒšw…“- -”åQˆä½†ä¸æå–它åQ‰ï¼Œæ£åˆ™è¡¨è¾¾å¼ä¸é—´åŠ å…¥äº†“\s-\s-\s”。完整的æ£åˆ™è¡¨è¾¾å¼å¦‚囑ֿ‰€½Cºã€?/td> |
|
囑ÖåQšåŒ¹é…IP地å€å’Œæ—¶é—´æ ‡è®?/p> |
现在æ£åˆ™è¡¨è¾¾å¼å·²¾l编写完毕,接下æ¥å¯ä»¥ç¼–写ä‹É用æ£åˆ™è¡¨è¾‘ּ库的Java代ç 了ã€?/td> |
ä¸ÞZ‹É用Jakarta-OROåº“ï¼Œé¦–å…ˆåˆ›å¾æ£åˆ™è¡¨è¾¾å¼å—½W¦ä¸²å’Œå¾…分æžçš„æ—¥å¿—记录嗽W¦ä¸²åQ?/td> |
![]() |
˜q™é‡Œä½¿ç”¨çš„æ£åˆ™è¡¨è¾‘Ö¼ä¸Žå›¾åçš„æ£åˆ™è¡¨è¾¾å¼å·®ä¸å¤šå®Œå…¨ç›¸åŒåQŒä½†æœ‰ä¸€ç‚¹ä¾‹å¤–:在Javaä¸ï¼Œä½ å¿…™åÕd¯¹æ¯ä¸€ä¸ªå‘å‰çš„æ–œæ åQ?#8220;\”åQ‰è¿›è¡Œè{义处ç†ã€‚图å䏿˜¯Java的表½CºåÅžå¼ï¼Œæ‰€ä»¥æˆ‘们è¦åœ¨æ¯ä¸?#8220;\”å‰é¢åŠ ä¸Šä¸€ä¸?#8220;\”以å…出现¾~–è¯‘é”™è¯¯ã€‚é—æ†„¡š„是,转义处熘q‡ç¨‹å¾ˆå®¹æ˜“出现错误,所以应该å°å¿ƒè°}æ…Žã€‚ä½ å¯ä»¥é¦–先输入未ç»è½¬ä¹‰å¤„ç†çš„æ£åˆ™è¡¨è¾‘Ö¼åQŒç„¶åŽä»Žå·¦åˆ°å³ä¾‹Æ¡æŠŠæ¯ä¸€ä¸?#8220;\”æ›¿æ¢æˆ?#8220;\\”。如果è¦å¤æ£€åQŒä½ å¯ä»¥è¯•ç€æŠŠå®ƒè¾“å‡ºåˆ°å±òq•上ã€?/td> |
åˆå§‹åŒ–å—½W¦ä¸²ä¹‹åŽåQŒå®žä¾‹åŒ–PatternCompiler对象åQŒç”¨PatternCompiler¾~–译æ£åˆ™è¡¨è¾¾å¼åˆ›å»ÞZ¸€ä¸ªPattern对象åQ?/td> |
![]() |
现在åQŒåˆ›å»ºPatternMatcher对象åQŒè°ƒç”¨PatternMatcher接å£çš„contain()æ–ÒŽ³•‹‚€æŸ¥åŒ¹é…情况: |
![]() |
接下æ¥ï¼Œåˆ©ç”¨PatternMatcher接壘q”回的MatchResult对象åQŒè¾“出匹é…çš„¾l„。由于logEntryå—符串包å«åŒ¹é…的内容åQŒä½ å¯ä»¥çœ‹åˆ°¾cÕd¦‚下é¢çš„输出: |
![]() |
3.2 HTML处ç†å®žä¾‹ä¸€ |
下é¢ä¸€ä¸ªä“Q务是分æžHTML™åµé¢å†…FONTæ ‡è®°çš„æ‰€æœ‰å±žæ€§ã€‚HTML™åµé¢å†…典型的FONTæ ‡è®°å¦‚ä¸‹æ‰€½Cºï¼š |
![]() |
½E‹åºž®†æŒ‰ç…§å¦‚下åÅžå¼ï¼Œè¾“出æ¯ä¸€ä¸ªFONTæ ‡è®°çš„å±žæ€§ï¼š |
![]() |
在这¿U情况下åQŒæˆ‘廸™®®ä½ ä‹É用两个æ£åˆ™è¡¨è¾‘ּ。第一个如囑Ö一所½Cºï¼Œå®ƒä»Žå—ä½“æ ‡è®°æå–å‡?#8220;"face="Arial, Serif" size="+2" color="red"”ã€?/td> |
|
囑Ö一åQšåŒ¹é…FONTæ ‡è®°çš„æ‰€æœ‰å±žæ€?/p> |
½W¬äºŒä¸ªæ£åˆ™è¡¨è¾‘ּ如图å二所½Cºï¼Œå®ƒæŠŠå„个属性分割æˆåå—-值对ã€?/td> |
|
囑Ö二:匚w…å•个属性,òq¶æŠŠå®ƒåˆ†å‰²æˆåå—-值对 |
分割¾l“果为: |
![]() |
现在我们æ¥çœ‹çœ‹å®Œæˆè¿™ä¸ªä“Q务的Java代ç 。首先创å»ÞZ¸¤ä¸ªæ£åˆ™è¡¨è¾‘Ö¼å—符ä¸ÔŒ¼Œç”¨Perl5Compiler把它们编译æˆPattern对象。编译æ£åˆ™è¡¨è¾‘ּ的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项åQŒä‹Éå¾—åŒ¹é…æ“作ä¸åŒºåˆ†å¤§å°å†™ã€?/td> |
接下æ¥ï¼Œåˆ›å¾ä¸€ä¸ªæ‰§è¡ŒåŒ¹é…æ“作的Perl5Matcher对象ã€?/td> |
![]() |
å‡è®¾æœ‰ä¸€ä¸ªString¾cÕdž‹çš„å˜é‡htmlåQŒå®ƒä»£è¡¨äº†HTMLæ–‡äšgä¸çš„一行内å®V€‚如果htmlå—符串包å«FONTæ ‡è®°åQŒåŒ¹é…器ž®†è¿”回trueã€‚æ¤æ—Óž¼Œä½ å¯ä»¥ç”¨åŒšw…器对象返回的MatchResult对象获得½W¬ä¸€ä¸ªç»„åQŒå®ƒåŒ…å«äº†FONT的所有属性: |
![]() |
接下æ¥åˆ›å»ÞZ¸€ä¸ªPatternMatcherInput对象。这个对象å…è®æ€½ 从最åŽä¸€‹Æ¡åŒ¹é…çš„ä½ç½®å¼€å§‹ç‘ô¾lè¿›è¡ŒåŒ¹é…æ“ä½œï¼Œå› æ¤åQŒå®ƒå¾ˆé€‚åˆäºŽæå–FONTæ ‡è®°å†…å±žæ€§çš„åå—-值对。创建PatternMatcherInput对象åQŒä»¥å‚æ•°å½¢å¼ä¼ 入待匹é…çš„å—符丌Ӏ‚ç„¶åŽï¼Œç”¨åŒ¹é…器实例æå–出æ¯ä¸€ä¸ªFONT的属性。这通过指定PatternMatcherInput对象åQˆè€Œä¸æ˜¯å—½W¦ä¸²å¯¹è±¡åQ‰äØ“å‚æ•°åQŒåå¤åœ°è°ƒç”¨PatternMatcher对象的contains()æ–ÒŽ³•完æˆã€‚PatternMatcherInput对象之ä¸çš„æ¯ä¸€‹Æ¡è„P代将把它内部的指针å‘å‰ç§»åŠ¨ï¼Œä¸‹ä¸€‹Æ¡æ£€‹¹‹å°†ä»Žå‰ä¸€‹Æ¡åŒ¹é…ä½¾|®çš„åŽé¢å¼€å§‹ã€?/td> |
本例的输出结果如下: |
![]() |
3.3 HTML处ç†å®žä¾‹äº?/strong> |
䏋颿ˆ‘们æ¥çœ‹çœ‹å¦ä¸€ä¸ªå¤„ç†HTML的例å。这一‹Æ¡ï¼Œæˆ‘们å‡å®šWebæœåŠ¡å™¨ä»Žwidgets.acme.com¿UÕdˆ°äº†newserver.acme.comã€‚çŽ°åœ¨ä½ è¦ä¿®æ”¹ä¸€äº›é¡µé¢ä¸çš„链接: |
![]() |
执行˜q™ä¸ªæœçƒ¦çš„æ£åˆ™è¡¨è¾‘Ö¼å¦‚å›¾å三所½Cºï¼š |
|
囑Ö三:匚w…修改å‰çš„链接 |
如果能够匚w…˜q™ä¸ªæ£åˆ™è¡¨è¾¾å¼ï¼Œä½ å¯ä»¥ç”¨ä¸‹é¢çš„内å®ÒŽ›¿æ¢å›¾å三的链接: |
![]() |
注æ„#å—符的åŽé¢åŠ ä¸Šäº†$1。Perlæ£åˆ™è¡¨è¾¾å¼è¯æ³•用$1ã€?2½{‰è¡¨½Cºå·²¾l匹é…且æå–出æ¥çš„组。图å三的表辑ּ把所有作ä¸ÞZ¸€ä¸ªç»„匚w…å’Œæå–出æ¥çš„å†…å®¹é™„åŠ åˆ°é“¾æŽ¥çš„åŽé¢ã€?/td> |
现在åQŒè¿”回Java。就象å‰é¢æˆ‘们所åšçš„é‚£æ ·åQŒä½ 必须创律¹‹è¯•å—符ä¸ÔŒ¼Œåˆ›å¾æŠŠæ£åˆ™è¡¨è¾‘Ö¼¾~–译到Pattern对象所必需的对象,以åŠåˆ›å¾ä¸€ä¸ªPatternMatcher对象åQ?img style="width: 500px; height: 181px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_v.jpg" border="0" _extended="true" /> |
接下æ¥ï¼Œç”¨com.oroinc.text.regex包Util¾cÈš„substitute()陿€æ–¹æ³•进行替æ¢ï¼Œè¾“出¾l“æžœå—符ä¸ÔŒ¼š |
![]() |
Util.substitute()æ–ÒŽ³•çš„è¯æ³•如下: |
![]() |
˜q™ä¸ªè°ƒç”¨çš„å‰ä¸¤ä¸ªå‚数是以å‰åˆ›å»ºçš„PatternMatcherå’ŒPatternå¯¹è±¡ã€‚ç¬¬ä¸‰ä¸ªå‚æ•°æ˜¯ä¸€ä¸ªSubstiution对象åQŒå®ƒå†›_®šäº†æ›¿æ¢æ“作如何进行。本例ä‹É用的是Perl5Substitution对象åQŒå®ƒèƒ½å¤Ÿ˜q›è¡ŒPerl5é£Žæ ¼çš„æ›¿æ¢ã€‚ç¬¬å››ä¸ªå‚æ•°æ˜¯æƒ³è¦è¿›è¡Œæ›¿æ¢æ“作的å—符ä¸ÔŒ¼Œæœ€åŽä¸€ä¸ªå‚æ•°å…è®¸æŒ‡å®šæ˜¯å¦æ›¿æ¢æ¨¡å¼çš„æ‰€æœ‰åŒ¹é…åä¸ÔŒ¼ˆUtil.SUBSTITUTE_ALLåQ‰ï¼Œæˆ–åªæ›¿æ¢æŒ‡å®šçš„æ¬¡æ•°ã€?/td> |
ã€ç»“æŸè¯ã€?/strong>在这½‹‡æ–‡ç« ä¸åQŒæˆ‘ä¸ÞZ½ 介ç»äº†æ£åˆ™è¡¨è¾‘ּ的强大功能。åªè¦æ£¼‹®è¿ç”¨ï¼Œæ£åˆ™è¡¨è¾¾å¼èƒ½å¤Ÿåœ¨å—符串æå–和文本修改ä¸è“v到很大的作用。å¦å¤–,我还介ç»äº†å¦‚何在Java½E‹åºä¸é€šè¿‡Jakarta-ORO库利用æ£åˆ™è¡¨è¾‘ּ。至于最¾lˆé‡‡ç”¨è€å¼çš„å—½W¦ä¸²å¤„ç†æ–¹å¼åQˆä‹É用StringTokenizeråQŒcharAtåQŒå’ŒsubstringåQ‰ï¼Œ˜q˜æ˜¯é‡‡ç”¨æ£åˆ™è¡¨è¾¾å¼ï¼Œ˜q™å°±æœ‰å¾…ä½ è‡ªå·±å†³å®šäº†ã€?/td> |