Java/Regular Expressions/Serialization
Содержание
Apply Regular Expressions on the contents of a file
<source lang="java">
import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main {
public static void main(String[] argv) throws Exception { Pattern pattern = Pattern.rupile("pattern"); FileInputStream input = new FileInputStream("file.txt"); FileChannel channel = input.getChannel(); ByteBuffer bbuf = channel.map(FileChannel.MapMode.READ_ONLY, 0, (int) channel.size()); CharBuffer cbuf = Charset.forName("8859_1").newDecoder().decode(bbuf); Matcher matcher = pattern.matcher(cbuf); while (matcher.find()) { String match = matcher.group(); System.out.println(match); } }
}
</source>
Reading Lines from a String Using a Regular Expression
<source lang="java">
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main {
public static void main(String[] argv) throws Exception { CharSequence inputStr = "a\rb"; inputStr = "a\r\nb"; inputStr = "a\nb"; String patternStr = "^(.*)$"; Pattern pattern = Pattern.rupile(patternStr, Pattern.MULTILINE); Matcher matcher = pattern.matcher(inputStr); while (matcher.find()) { String lineWithTerminator = matcher.group(0); String lineWithoutTerminator = matcher.group(1); } }
}
</source>
Use FileChannels and ByteBuffers to Store Patterns
<source lang="java">
//Example File /*
- Email validator that adheres directly to the specification
- for email address naming. It allows for everything from
- ipaddress and country-code domains to very rare characters
- in the username.
email=^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0- 9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0- 9]{1,3})(\]?)$
- Matches UK postcodes according to the following rules 1. LN NLL
- eg N1 1AA 2. LLN NLL eg SW4 0QL 3. LNN NLL eg M23 4PJ 4. LLNN NLL
- eg WS14 0JT 5. LLNL NLL eg SW1N 4TB 6. LNL NLL eg W1C 8LQ Thanks
- to Simon Bell for informin ...
zip=^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$
- This regular expression matches dates of the form XX/XX/YYYY
- where XX can be 1 or 2 digits long and YYYY is always 4
- digits long.
dates=^\d{1,2}\/\d{1,2}\/\d{4}$
- /
import java.util.Properties; import java.util.regex.*; import java.util.*; import java.io.*; import java.nio.*; import java.nio.channels.*; import java.util.logging.Logger; public class RegexProperties extends Properties {
private static Logger log = Logger.getAnonymousLogger(); public void load(String inStream) throws IOException, PatternSyntaxException { load(new FileInputStream(inStream)); } public void load(FileInputStream inStream) throws IOException, PatternSyntaxException { FileChannel fc = inStream.getChannel(); ByteBuffer bb = ByteBuffer.allocate((int) fc.size()); fc.read(bb); bb.flip(); String fileContent = new String(bb.array()); Pattern pattern = Pattern.rupile("^(.*)$", Pattern.MULTILINE); Matcher matcher = pattern.matcher(fileContent); while (matcher.find()) { String line = matcher.group(1); if (line != null && !"".equals(line.trim()) && !line.startsWith("#") && !line.startsWith("!")) { String keyValue[] = null; if (line.indexOf("=") > 0) keyValue = line.split("=", 2); else keyValue = line.split(":", 2); if (keyValue != null) { super.put(keyValue[0].trim(), keyValue[1]); } } } fc = null; bb = null; } public void store(FileOutputStream out, String header) throws UnsupportedOperationException { throw new UnsupportedOperationException("unsupported for this class"); } public void putAll(Map t) { throw new UnsupportedOperationException("unsupported for this class"); }
}
</source>
Using a Regular Expression to Filter Lines from a Reader
<source lang="java">
import java.io.BufferedReader; import java.io.FileReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main {
public static void main(String[] argv) throws Exception { String filename = "infile.txt"; String patternStr = "pattern"; BufferedReader rd = new BufferedReader(new FileReader(filename)); Pattern pattern = Pattern.rupile(patternStr); Matcher matcher = pattern.matcher("\\D"); String line = null; while ((line = rd.readLine()) != null) { matcher.reset(line); if (matcher.find()) { // line matches the pattern } } }
}
</source>