diff --git a/src/JRexFrame.java b/src/JRexFrame.java index 8d6d897..7b36c9f 100644 --- a/src/JRexFrame.java +++ b/src/JRexFrame.java @@ -2,6 +2,7 @@ import java.awt.Color; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SpinnerNumberModel; @@ -358,48 +359,89 @@ String regex = txtRegex.getText(); String text = txtInput.getText(); - String[] input = text.split("\n"); + String[] input = null; - Pattern pattern = Pattern.compile(regex); + try { - DefaultTableModel model = new DefaultTableModel(); - jTable.setModel(model); + Pattern pattern = Pattern.compile(regex); - int numMatches = 0; + int flagsMask = pattern.flags(); - for (String line : input) { - Matcher matcher = pattern.matcher(line); - if (matcher.find()) { + StringBuilder flags = new StringBuilder(); - numMatches++; + boolean dotall = false; - int groupCount = matcher.groupCount(); - - model.setColumnCount(groupCount); - - Object[] headers = new Object[groupCount]; - - for (int k = 0; k < groupCount; k++) { - headers[k] = k + 1; - } - - model.setColumnIdentifiers(headers); - - txtOutput.append(matcher.group(0) + "\n"); - - String[] groups = new String[matcher.groupCount()]; - for (int j = 1; j <= matcher.groupCount(); j++) { - String s = matcher.group(j); - groups[j - 1] = s; - } - - model.addRow(groups); + // work out which flags are being used + if ((flagsMask & Pattern.DOTALL) == Pattern.DOTALL) { + flags.append("DOTALL "); + dotall = true; } - } - txtOutput.setText(""); - txtOutput.append("Matched " + numMatches + " line(s) out of " - + input.length + " line(s) of input."); + if ((flagsMask & Pattern.MULTILINE) == Pattern.MULTILINE) { + flags.append("MULTILINE "); + } + + if ((flagsMask & Pattern.CASE_INSENSITIVE) == Pattern.CASE_INSENSITIVE) { + flags.append("CASE_INSENSITIVE "); + } + + DefaultTableModel model = new DefaultTableModel(); + jTable.setModel(model); + + int numMatches = 0; + + // it DOTALL mode is on then grab the entire text rather then seperating by line + if (dotall) { + input = new String[1]; + input[0] = text; + } else { + input = text.split("\n"); + } + + + for (String line : input) { + Matcher matcher = pattern.matcher(line); + while (matcher.find()) { + + numMatches++; + + int groupCount = matcher.groupCount(); + + model.setColumnCount(groupCount); + + Object[] headers = new Object[groupCount]; + + for (int k = 0; k < groupCount; k++) { + headers[k] = k + 1; + } + + model.setColumnIdentifiers(headers); + + txtOutput.append(matcher.group(0) + "\n"); + + String[] groups = new String[matcher.groupCount()]; + for (int j = 1; j <= matcher.groupCount(); j++) { + String s = matcher.group(j); + groups[j - 1] = s; + } + + model.addRow(groups); + } + } + + txtOutput.setText(""); + txtOutput.append("Matched " + numMatches + " line(s) out of " + + input.length + " line(s) of input."); + + if (!flags.toString().isEmpty()) { + txtOutput.append("\n\nFlags: " + flags.toString().trim()); + } + + } catch (PatternSyntaxException ex) { + txtOutput.setText(""); + txtOutput.append("Error in expression\n\n"); + txtOutput.append(ex.getMessage()); + } } private void format() {