(?n) to turn mode on
(?-n) to turn mode off
n は、モード・タイプを指定する単一の小文字です。
以下の例は、ケース・モード (?i) を示します。
WRITE $MATCH("A","(?i)[abc]"),!
WRITE $MATCH("a","(?i)[abc]")
以下の例は、ケース・モード (?i) を示します。最初の正規表現では大文字と小文字が区別されます。2 番目の正規表現における先頭はケース・モード修飾子 (?i) であり、正規表現では大文字と小文字が区別されません。
SET name(1)="Smith,John"
SET name(2)="dePaul,Lucius"
SET name(3)="smith,john"
SET name(4)="John Smith"
SET name(5)="Smith,J"
SET name(6)="R2D2,CP30"
SET n=1
WHILE $DATA(name(n)) {
IF $MATCH(name(n),"\p{LU}\p{LL}+,\p{LU}\p{LL}+")
{ WRITE name(n)," : case match",! }
ELSEIF $MATCH(name(n),"(?i)\p{LU}\p{LL}+,\p{LU}\p{LL}+")
{ WRITE name(n)," : non-case match",! }
ELSE { WRITE name(n)," : not a valid name",! }
SET n=n+1 }
以下の例は、単一行モード (?s) を示します。このモードでは、".*" が改行文字のある文字列に一致します。
SET line(1)="This is a string without line breaks."
SET line(2)="This is a string with"_$CHAR(10)_"one line break."
SET line(3)="This is a string"_$CHAR(11)_"with"_$CHAR(12)_"two line breaks."
SET i=1
WHILE $DATA(line(i)) {
IF $MATCH(line(i),".*") {WRITE "line(",i,") is a single line string",! }
ELSEIF $MATCH(line(i),"(?s).*") {WRITE "line(",i,") is a multiline string",! }
ELSE {WRITE "string error",! }
SET i=i+1 }
以下の例は、単一行モード (?s) を示します。キャリッジ・リターンと改行のペアがその順序出現すると、正規表現で 1 文字としてカウントされます。
SET str(1)="one"_$CHAR(13)_$CHAR(10)_"two" // CR/LF
SET str(2)="one"_$CHAR(10)_$CHAR(13)_"two" // LF/CR
SET i=1
WHILE $DATA(str(i)) {
WRITE $LENGTH(str(i))," is the length of string ",i,!
IF $MATCH(str(i),"(?s).{7}") { WRITE "string ",i," matches 7 chars",! }
ELSEIF $MATCH(str(i),"(?s).{8}") { WRITE "string ",i," matches 8 chars",! }
ELSE { WRITE "string match error",! }
SET i=i+1
}
以下の例は、複数行モード (?m) を示します。終端アンカー ($) により識別される部分文字列を探します。単一行モードでは、この終端部分文字列は必ず “break” (文字列における最後の部分文字列) になります。複数行モードでは、終端部分文字列は、複数行文字列内で行が終了する任意の部分文字列にできます。
SET line(1)="String without line break"
SET line(2)="String with"_$CHAR(10)_" one line break"
SET line(3)="String"_$CHAR(11)_" with"_$CHAR(12)_" two line break"
SET i=1
WHILE $DATA(line(i)) {
WRITE $LOCATE(line(i),"(String|with|break)$")," line(",i,") in single-line mode",!
WRITE $LOCATE(line(i),"(?m)(String|with|break)$")," line(",i,") in multi-line mode",!!
SET i=i+1 }
リテラルのモード
また、以下の構文を使用して、モード修飾子をリテラル (またはリテラルのセット) に適用できます。
このモード修飾子は、括弧内のリテラルにのみ適用されます。
以下のケース・モード (?i) 例では、この接頭語の大文字化処理に関係なく、先頭が de、del、dela、および della である名字 (lname) に一致します。残りの lname は大文字で始まり、小文字が 1 文字以上その後に続く必要があります。
SET lname(1)="deTour"
SET lname(2)="DeMarco"
SET lname(3)="DeLaRenta"
SET lname(4)="DelCarmine"
SET lname(5)="dellaRobbia"
SET i=1
WHILE $DATA(lname(i)) {
WRITE $MATCH(lname(i),"(?i:de|del|dela|della)\p{LU}\p{LL}+")," = ",lname(i),!
SET i=i+1 }