メールアドレスの正規表現…etc

メールアドレスの正規表現

一応RFC2822の規格内。改行は不可。

^[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+)*@[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+)*$

「root@localhost」とかをはじきたいなら、末尾の「*$」を「+$」。
IPアドレスをはじきたいなら、次の正規表現にマッチしたアドレスをはじけばよいと思う。(1つの正規表現での表し方は不明)

^[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+)*@[0-9]+(\.[0-9]+)*$

文字数の制限はRFCに載っていたか思い出せない…256文字ぐらいかな。

CSVの仕様と解析用の正規表現

仕様はこんな感じ。

  1. 値は「,」(0x2C)で区切られる。例) 値1,値2,…
  2. 値に「,」(0x2C)が含まれる場合、「"」(0x22)で囲む。例)"A,B","1,2,3",…
  3. 値に「"」(0x22)が含まれる場合、「"」をエンクォート*1して「"」で囲む。例)"a=""123""","b=""345""",…

正規表現はこんな感じ(JDK1.4の正規表現ライブラリで動作確認)

("(?:[^"]|""|\P{ASCII})*"|(?:[^,]|\P{ASCII})*),

解析用のコードはこんな感じ。


private List parse(String line) {
List list = new ArrayList();
Pattern pattern = Pattern.compile("(\"(?:[^\"]|\"\"|\\P{ASCII})*\"|(?:[^,]|\\P{ASCII})*),");
Matcher matcher = pattern.matcher(line + ",");

while (matcher.find())
list.add(decode(matcher.group(1)));

return list;
}

private String decode(String value) {
Pattern pattern = Pattern.compile("^ *\"(.*)\" *");
Matcher matcher = pattern.matcher(value);

if (matcher.matches())
value = matcher.group(1);

return value.replaceAll("\"\"", "\"");
}

参考1
CSVTokenizer & CSVLine
参考2
Perlメモ

*1:「"」を2個にする