正規表現
class Pattern
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
ex...
boolean isValisName(String name){
return name.matches("[A-Z][A-Z0-9]{7}");
上記の条件だと・・・
最初の文字は英数大文字 A~Z
次の文字は+数字もおk
そして8文字に限定
構文 | Matches |
---|---|
文字 | |
x | 文字 x |
\\ | バックスラッシュ文字 |
\0n | 8 進値 0n を持つ文字 (0 <= n <= 7) |
\0nn | 8 進値 0nn を持つ文字 (0 <= n <= 7) |
\0mnn | 8 進値 0mnn を持つ文字 (0 <= m <= 3、0 <= n <= 7) |
\xhh | 16 進値 0xhh を持つ文字 |
\uhhhh | 16 進値 0xhhhh を持つ文字 |
\t | タブ文字 ('\u0009') |
\n | 改行文字 ('\u000A') |
\r | キャリッジリターン文字 ('\u000D') |
\f | 用紙送り文字 ('\u000C') |
\a | 警告 (ベル) 文字 ('\u0007') |
\e | エスケープ文字 ('\u001B') |
\cx | x に対応する制御文字 |
文字クラス | |
[abc] | a、b、または c (単純クラス) |
[^abc] | a、b、c 以外の文字 (否定) |
[a-zA-Z] | a 〜 z または A 〜 Z (範囲) |
[a-d[m-p]] | a 〜 d、または m 〜 p:[a-dm-p] (結合) |
[a-z&&[def]] | d、e、f (交差) |
[a-z&&[^bc]] | b と c を除く a 〜 z:[ad-z] (減算) |
[a-z&&[^m-p]] | m 〜 p を除く a 〜 z:[a-lq-z] (減算) |
定義済みの文字クラス | |
. | 任意の文字 (行末記号とマッチする場合もある) |
\d | 数字: [0-9] |
\D | 数字以外: [^0-9] |
\s | 空白文字:[ \t\n\x0B\f\r] |
\S | 非空白文字:[^\s] |
\w | 単語構成文字:[a-zA-Z_0-9] |
\W | 非単語文字:[^\w] |
POSIX 文字クラス (US-ASCII のみ) | |
\p{Lower} | 小文字の英字:[a-z] |
\p{Upper} | 大文字の英字: [A-Z] |
\p{ASCII} | すべての ASCII 文字: [\x00-\x7F] |
\p{Alpha} | 英字: [\p{Lower}\p{Upper}] |
\p{Digit} | 10 進数字: [0-9] |
\p{Alnum} | 英数字: [\p{Alpha}\p{Digit}] |
\p{Punct} | 句読文字:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のいずれか |
\p{Graph} | 表示できる文字:[\p{Alnum}\p{Punct}] |
\p{Print} | プリント可能文字:[\p{Graph}\x20] |
\p{Blank} | 空白またはタブ:[ \t] |
\p{Cntrl} | 制御文字:[\x00-\x1F\x7F] |
\p{XDigit} | 16 進数字:[0-9a-fA-F] |
\p{Space} | 空白文字:[ \t\n\x0B\f\r] |
java.lang.Character クラス (単純な java 文字タイプ) | |
\p{javaLowerCase} | java.lang.Character.isLowerCase() と等価 |
\p{javaUpperCase} | java.lang.Character.isUpperCase() と等価 |
\p{javaWhitespace} | java.lang.Character.isWhitespace() と等価 |
\p{javaMirrored} | java.lang.Character.isMirrored() と等価 |
Unicode ブロックとカテゴリのクラス | |
\p{InGreek} | ギリシャ語ブロックの文字 (単純ブロック) |
\p{Lu} | 大文字 (単純カテゴリ) |
\p{Sc} | 通貨記号 |
\P{InGreek} | ギリシャ語ブロック以外の文字 (否定) |
[\p{L}&&[^\p{Lu}]] | 大文字以外の文字 (減算) |
境界正規表現エンジン | |
^ | 行の先頭 |
$ | 行の末尾 |
\b | 単語境界 |
\B | 非単語境界 |
\A | 入力の先頭 |
\G | 前回のマッチの末尾 |
\Z | 最後の行末記号がある場合は、それを除く入力の末尾 |
\z | 入力の末尾 |
最長一致数量子 | |
X? | X、1 または 0 回 |
X* | X、0 回以上 |
X+ | X、1 回以上 |
X{n} | X、n 回 |
X{n,} | X、n 回以上 |
X{n,m} | X、n 回以上、m 回以下 |
最短一致数量子 | |
X?? | X、1 または 0 回 |
X*? | X、0 回以上 |
X+? | X、1 回以上 |
X{n}? | X、n 回 |
X{n,}? | X、n 回以上 |
X{n,m}? | X、n 回以上、m 回以下 |
強欲な数量子 | |
X?+ | X、1 または 0 回 |
X*+ | X、0 回以上 |
X++ | X、1 回以上 |
X{n}+ | X、n 回 |
X{n,}+ | X、n 回以上 |
X{n,m}+ | X、n 回以上、m 回以下 |
論理演算子 | |
XY | X の直後に Y |
X|Y | X または Y |
(X) | X、前方参照を行う正規表現グループ |
前方参照 | |
\n | マッチした n 番目の前方参照を行う正規表現グループ |
引用 | |
\ | 正規表現ではないが、次の文字をエスケープする |
\Q | 正規表現ではないが、\E までのすべての文字をエスケープする |
\E | 正規表現ではないが、\Q で開始された引用をエスケープする |
特殊な構文 (前方参照を行わない) | |
(?:X) | X、前方参照を行わない正規表現グループ |
(?idmsux-idmsux) | 正規表現ではないが、マッチフラグ i、d、m、s、u、x のオン/オフを切り替える |
(?idmsux-idmsux:X) | X、前方参照を行わないグループ。指定されたフラグ i、d、m、s、u、x のオン/オフを切り替える |
(?=X) | X、幅ゼロの肯定先読み |
(?!X) | X、幅ゼロの否定先読み |
(?<=X) | X、幅ゼロの肯定後読み |
(?<!X) | X、幅ゼロの否定後読み |
(?>X) | X、独立した前方参照を行わない正規表現グループ |
逆ポーランド記法について
数式やプログラムを記述する方法(記法)の一種。演算子(オペレータ)を被演算子(オペランド)の後(右)に記述することから、後置記法 (Postfix Notation) とも言う。
javaのStackクラスを使う
縦長のビーカーがあるのをイメージし、数字を順番に入れていく。
演算子がある場合、スタックから数字2つを取り出し計算結果を上に積み上げる。
一番上にある数字が答えとなる。
「1 2 +」は「3」、「15 10 -」は「5」、「15 10 - 3 *」は「15」
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; public class ReversePolishNotationOld { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] stringArray = br.readLine().split("\\s"); // 後に入れたものを先に抜き出す(いわゆるLIFO) Stack<Integer> que = new Stack<Integer>(); int a = 0; int b = 0; for (int i = 0; i < stringArray.length; i++) { if (stringArray[i].equals("+")) { a = que.pop(); b = que.pop(); que.add(b + a); continue; } if (stringArray[i].equals("-")) { a = que.pop(); b = que.pop(); que.add(b - a); continue; } if (stringArray[i].equals("*")) { a = que.pop(); b = que.pop(); que.add(b * a); continue; } if (stringArray[i].equals("/")) { a = que.pop(); b = que.pop(); que.add(b / a); continue; } // 演算子以外はstackに登録する que.push(Integer.parseInt(stringArray[i])); } System.out.println(que.pop()); } }
parserについて勉強
ActionScriptにて、ぼちぼち理解はしたのですが
ぼやーっとしてしまっているので、javaで作り直し中。
paserという単語自体を知らなかったので、非常に勉強になる。
paserができたら自ずとUnityに対する理解も深まりそう。
parserとは
parser:
プログラムのソースコードやXML文書など、一定の文法に従って記述された複雑な構造のテキスト文書を解析し、プログラムで扱えるようなデータ構造の集合体に変換するプログラムのこと。そのような処理のことを「構文解析」「パース」(parse)という。
参考URL
Javaでコンパイラの基礎を理解する(6):もしも、コンパイラ専門書が読めたなら…… (1/4) - @IT
Javaで実現するDOM/SAXプログラミング(1):必要なのはJ2SEとXMLパーサ (3/4) - @IT
二分木を使った数式の逆ポーランド記法化と計算 - Programming/Tips - 総武ソフトウェア推進所
これはこれで楽ですなぁ。
javaとC#、しか触ったことがなく、しかもどちらもまだまだ勉強不足なのですが、
最近作っているものでActionScriptを触ってみようかなと思いまして、
試行錯誤しているのですが、、、
描画楽ですなぁ。使う場面が限られてしまったり、脆弱性があったりと、
多々理由はあるのでしょうが、パっと作ってしまいたい時は使っていこうかなぁ。
なんて思ったりしています。
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
をインポートしておいて、、、
var tf:TextField = new TextField();
tf.x = 50;//軸方向
tf.y = 50;
tf.width = 300;//大きさ
tf.height = 50;
tf.multiline = false;//複数行かどうか falseで単一行
tf.border = true;//テキストフィールドに境界線があるかどうか
tf.type = TextFieldType.INPUT;//入力内容の取得
みたいな感じで書いていってるのですが、手っ取り早いですなぁ。