You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ak...@apache.org on 2022/05/09 07:02:31 UTC

[netbeans] branch master updated: Added java regex flags for text matching and Example generator from r… (#3252)

This is an automated email from the ASF dual-hosted git repository.

akhileshsingh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 8e7f1ca057 Added java regex flags for text matching and Example generator from r… (#3252)
8e7f1ca057 is described below

commit 8e7f1ca0575403699765eb95edba526ad7fe845f
Author: Sandeep Mishra <72...@users.noreply.github.com>
AuthorDate: Mon May 9 12:32:25 2022 +0530

    Added java regex flags for text matching and Example generator from r… (#3252)
    
    * Added java regex flags for text matching and Example generator from regex
---
 java/java.hints/nbproject/project.xml              |   8 +
 .../modules/java/hints/jdk/Bundle.properties       |  27 ++
 .../java/hints/jdk/CheckRegexTopComponent.form     | 228 +++++++++-
 .../java/hints/jdk/CheckRegexTopComponent.java     | 305 ++++++++++++-
 .../java/hints/jdk/RegexExampleVisualPanel1.form   | 131 ++++++
 .../java/hints/jdk/RegexExampleVisualPanel1.java   | 163 +++++++
 .../java/hints/regex/parser/ExampleGenerator.java  | 185 ++++++++
 .../java/hints/regex/parser/RegExParser.java       | 503 +++++++++++++++++++++
 .../java/hints/regex/parser/RegexConstructs.java   | 495 ++++++++++++++++++++
 .../hints/regex/parser/ExampleGeneratorTest.java   | 129 ++++++
 10 files changed, 2160 insertions(+), 14 deletions(-)

diff --git a/java/java.hints/nbproject/project.xml b/java/java.hints/nbproject/project.xml
index b21b337343..e3d88fab5c 100644
--- a/java/java.hints/nbproject/project.xml
+++ b/java/java.hints/nbproject/project.xml
@@ -78,6 +78,14 @@
                         <specification-version>1.40</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.templates</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.21</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.netbeans.libs.javacapi</code-name-base>
                     <build-prerequisite/>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/Bundle.properties b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/Bundle.properties
index 2298007fee..706e2338d7 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/Bundle.properties
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/Bundle.properties
@@ -120,3 +120,30 @@ CheckRegexTopComponent.strictCheckBox.text=Str&ict Check
 #{2}: PatternSyntaxException.getPattern()
 #{3}: PatternSyntaxException.getIndex()
 DN_RegExp=Invalid regular expression: {0}
+CheckRegexTopComponent.flagsButton.text=Regex Flags
+CheckRegexTopComponent.dotAllMenuItem.text=DOTALL
+CheckRegexTopComponent.caseInsensitiveMenuItem.text=CASE_INSENSITIVE
+CheckRegexTopComponent.unicodeCaseMenuItem.text=UNICODE_CASE
+CheckRegexTopComponent.unicodeCharacterClassMenuItem.text=UNICODE_CHARACTER_CLASS
+CheckRegexTopComponent.commentsMenuItem.text=COMMENTS
+CheckRegexTopComponent.literalMenuItem.text=LITERAL
+CheckRegexTopComponent.multilineMenuItem.text=MULTILINE
+CheckRegexTopComponent.commentsMenuItem.toolTipText=Permits whitespace and comments in pattern
+CheckRegexTopComponent.multilineMenuItem.toolTipText=^ and $ match just after or just before a line terminator
+CheckRegexTopComponent.unicodeCaseMenuItem.toolTipText=Enables Unicode-aware case folding
+CheckRegexTopComponent.caseInsensitiveMenuItem.toolTipText=Enables case-insensitive matching
+CheckRegexTopComponent.dotAllMenuItem.toolTipText=. matches any character, including a line terminator
+CheckRegexTopComponent.unicodeCharacterClassMenuItem.toolTipText=Enables the Unicode version of Predefined character classes and POSIX character classes
+CheckRegexTopComponent.literalMenuItem.toolTipText=Enables literal parsing of the pattern
+CheckRegexTopComponent.unixLinesMenuItem.text=UNIX_LINES
+CheckRegexTopComponent.canonEqMenuItem.text=CANON_EQ
+CheckRegexTopComponent.unixLinesMenuItem.toolTipText=Only the '\\n' line terminator is recognized in the behavior of ., ^, and $
+CheckRegexTopComponent.canonEqMenuItem.toolTipText=Enables canonical equivalence=
+CheckRegexTopComponent.examplesButton.text=Generate Examples
+CheckRegexTopComponent.regexLabel1.text=Re&gular Expression:
+RegexExampleVisualPanel1.regExLabel.text=Regular Expression:
+RegexExampleVisualPanel1.numberField.text=10
+RegexExampleVisualPanel1.NoLabel.text=No.:
+RegexExampleVisualPanel1.regenerateButton.text=Regenerate
+RegexExampleVisualPanel1.REGEX_EXAMPLES=Regex Examples
+RegexExampleVisualPanel1.exampleTextArea.invalidText=Input valid number
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.form b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.form
index 56e5790705..83a197126b 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.form
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.form
@@ -22,6 +22,191 @@
 -->
 
 <Form version="1.9" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JPopupMenu" name="flagsPopupMenu">
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="multilineMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.multilineMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.multilineMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="multilineMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="literalMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.literalMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.literalMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="literalMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="dotAllMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.dotAllMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.dotAllMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dotAllMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="caseInsensitiveMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.caseInsensitiveMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.caseInsensitiveMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="caseInsensitiveMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="commentsMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.commentsMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.commentsMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="commentsMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="unixLinesMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unixLinesMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unixLinesMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="unixLinesMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="canonEqMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.canonEqMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.canonEqMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="canonEqMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="unicodeCaseMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unicodeCaseMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unicodeCaseMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="unicodeCaseMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JCheckBoxMenuItem" name="unicodeCharacterClassMenuItem">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unicodeCharacterClassMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.unicodeCharacterClassMenuItem.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="unicodeCharacterClassMenuItemActionPerformed"/>
+          </Events>
+        </MenuItem>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JFrame" name="examplesFrame">
+      <Properties>
+        <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+          <Color id="Default Cursor"/>
+        </Property>
+        <Property name="locationByPlatform" type="boolean" value="true"/>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jScrollPane1" min="-2" pref="306" max="-2" attributes="0"/>
+                      <Component id="regexLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace pref="15" max="32767" attributes="0"/>
+                  <Component id="regexLabel1" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Component id="jScrollPane1" min="-2" pref="235" max="-2" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTextArea" name="jTextArea1">
+              <Properties>
+                <Property name="columns" type="int" value="20"/>
+                <Property name="rows" type="int" value="5"/>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Component class="javax.swing.JLabel" name="regexLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.regexLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+  </NonVisualComponents>
   <AuxValues>
     <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
     <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
@@ -44,30 +229,41 @@
                   <Component id="exampleLabel" alignment="0" min="-2" max="-2" attributes="0"/>
                   <Group type="102" alignment="0" attributes="0">
                       <Component id="regexScrollPane" min="-2" pref="320" max="-2" attributes="0"/>
-                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <EmptySpace min="-2" pref="62" max="-2" attributes="0"/>
                       <Component id="errorLabel" min="-2" max="-2" attributes="0"/>
                   </Group>
                   <Component id="exampleLayeredPane" alignment="0" min="-2" max="-2" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
+                      <Component id="flagsButton" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="examplesButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
               </Group>
-              <EmptySpace pref="266" max="32767" attributes="0"/>
+              <EmptySpace min="-2" pref="266" max="-2" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
     <DimensionLayout dim="1">
       <Group type="103" groupAlignment="0" attributes="0">
           <Group type="102" alignment="1" attributes="0">
-              <EmptySpace max="32767" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
               <Component id="regexLabel" min="-2" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
               <Group type="103" groupAlignment="0" attributes="0">
                   <Component id="regexScrollPane" min="-2" pref="42" max="-2" attributes="0"/>
                   <Component id="errorLabel" min="-2" max="-2" attributes="0"/>
               </Group>
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
               <Component id="exampleLabel" min="-2" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
               <Component id="exampleLayeredPane" min="-2" max="-2" attributes="0"/>
               <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="flagsButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="examplesButton" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
     </DimensionLayout>
@@ -141,7 +337,7 @@
                       <Component id="strictCheckBox" min="-2" max="-2" attributes="0"/>
                       <Component id="iconLabel" min="-2" pref="18" max="-2" attributes="0"/>
                   </Group>
-                  <EmptySpace max="32767" attributes="0"/>
+                  <EmptySpace pref="9" max="32767" attributes="0"/>
               </Group>
               <Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
                   <Group type="102" alignment="0" attributes="0">
@@ -194,5 +390,25 @@
     </Container>
     <Component class="javax.swing.JLabel" name="errorLabel">
     </Component>
+    <Component class="javax.swing.JButton" name="flagsButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.flagsButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="flagsButtonActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="examplesButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="CheckRegexTopComponent.examplesButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="examplesButtonActionPerformed"/>
+      </Events>
+    </Component>
   </SubComponents>
 </Form>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.java b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.java
index 98652b0d6b..7c034254ae 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/CheckRegexTopComponent.java
@@ -19,6 +19,7 @@
 package org.netbeans.modules.java.hints.jdk;
 
 import java.awt.Color;
+import java.util.ArrayList;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -67,7 +68,8 @@ public final class CheckRegexTopComponent extends TopComponent {
     private static CheckRegexTopComponent instance;
     private static final String PREFERRED_ID = "CheckRegexTopComponent";
     private static boolean isStrictMatch;
-
+    private static int Flags = 0;
+    
     public CheckRegexTopComponent() {
         initComponents();
         setName(Bundle.CTL_CheckRegexTopComponent());
@@ -83,6 +85,20 @@ public final class CheckRegexTopComponent extends TopComponent {
     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
     private void initComponents() {
 
+        flagsPopupMenu = new javax.swing.JPopupMenu();
+        multilineMenuItem = new javax.swing.JCheckBoxMenuItem();
+        literalMenuItem = new javax.swing.JCheckBoxMenuItem();
+        dotAllMenuItem = new javax.swing.JCheckBoxMenuItem();
+        caseInsensitiveMenuItem = new javax.swing.JCheckBoxMenuItem();
+        commentsMenuItem = new javax.swing.JCheckBoxMenuItem();
+        unixLinesMenuItem = new javax.swing.JCheckBoxMenuItem();
+        canonEqMenuItem = new javax.swing.JCheckBoxMenuItem();
+        unicodeCaseMenuItem = new javax.swing.JCheckBoxMenuItem();
+        unicodeCharacterClassMenuItem = new javax.swing.JCheckBoxMenuItem();
+        examplesFrame = new javax.swing.JFrame();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        jTextArea1 = new javax.swing.JTextArea();
+        regexLabel1 = new javax.swing.JLabel();
         regexLabel = new javax.swing.JLabel();
         regexScrollPane = new javax.swing.JScrollPane();
         regexTextArea = new javax.swing.JTextArea();
@@ -93,6 +109,119 @@ public final class CheckRegexTopComponent extends TopComponent {
         exampleTextArea = new javax.swing.JTextArea();
         strictCheckBox = new javax.swing.JCheckBox();
         errorLabel = new javax.swing.JLabel();
+        flagsButton = new javax.swing.JButton();
+        examplesButton = new javax.swing.JButton();
+
+        org.openide.awt.Mnemonics.setLocalizedText(multilineMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.multilineMenuItem.text")); // NOI18N
+        multilineMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.multilineMenuItem.toolTipText")); // NOI18N
+        multilineMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                multilineMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(multilineMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(literalMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.literalMenuItem.text")); // NOI18N
+        literalMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.literalMenuItem.toolTipText")); // NOI18N
+        literalMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                literalMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(literalMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(dotAllMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.dotAllMenuItem.text")); // NOI18N
+        dotAllMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.dotAllMenuItem.toolTipText")); // NOI18N
+        dotAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                dotAllMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(dotAllMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(caseInsensitiveMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.caseInsensitiveMenuItem.text")); // NOI18N
+        caseInsensitiveMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.caseInsensitiveMenuItem.toolTipText")); // NOI18N
+        caseInsensitiveMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                caseInsensitiveMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(caseInsensitiveMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(commentsMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.commentsMenuItem.text")); // NOI18N
+        commentsMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.commentsMenuItem.toolTipText")); // NOI18N
+        commentsMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                commentsMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(commentsMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(unixLinesMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unixLinesMenuItem.text")); // NOI18N
+        unixLinesMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unixLinesMenuItem.toolTipText")); // NOI18N
+        unixLinesMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                unixLinesMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(unixLinesMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(canonEqMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.canonEqMenuItem.text")); // NOI18N
+        canonEqMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.canonEqMenuItem.toolTipText")); // NOI18N
+        canonEqMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                canonEqMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(canonEqMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(unicodeCaseMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unicodeCaseMenuItem.text")); // NOI18N
+        unicodeCaseMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unicodeCaseMenuItem.toolTipText")); // NOI18N
+        unicodeCaseMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                unicodeCaseMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(unicodeCaseMenuItem);
+
+        org.openide.awt.Mnemonics.setLocalizedText(unicodeCharacterClassMenuItem, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unicodeCharacterClassMenuItem.text")); // NOI18N
+        unicodeCharacterClassMenuItem.setToolTipText(org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.unicodeCharacterClassMenuItem.toolTipText")); // NOI18N
+        unicodeCharacterClassMenuItem.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                unicodeCharacterClassMenuItemActionPerformed(evt);
+            }
+        });
+        flagsPopupMenu.add(unicodeCharacterClassMenuItem);
+
+        examplesFrame.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
+        examplesFrame.setLocationByPlatform(true);
+
+        jTextArea1.setColumns(20);
+        jTextArea1.setRows(5);
+        jScrollPane1.setViewportView(jTextArea1);
+
+        org.openide.awt.Mnemonics.setLocalizedText(regexLabel1, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.regexLabel1.text")); // NOI18N
+
+        javax.swing.GroupLayout examplesFrameLayout = new javax.swing.GroupLayout(examplesFrame.getContentPane());
+        examplesFrame.getContentPane().setLayout(examplesFrameLayout);
+        examplesFrameLayout.setHorizontalGroup(
+            examplesFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(examplesFrameLayout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(examplesFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 306, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(regexLabel1))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        examplesFrameLayout.setVerticalGroup(
+            examplesFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, examplesFrameLayout.createSequentialGroup()
+                .addContainerGap(15, Short.MAX_VALUE)
+                .addComponent(regexLabel1)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap())
+        );
 
         org.openide.awt.Mnemonics.setLocalizedText(regexLabel, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.regexLabel.text")); // NOI18N
 
@@ -163,6 +292,20 @@ public final class CheckRegexTopComponent extends TopComponent {
                     .addGap(0, 6, Short.MAX_VALUE)))
         );
 
+        org.openide.awt.Mnemonics.setLocalizedText(flagsButton, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.flagsButton.text")); // NOI18N
+        flagsButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                flagsButtonActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(examplesButton, org.openide.util.NbBundle.getMessage(CheckRegexTopComponent.class, "CheckRegexTopComponent.examplesButton.text")); // NOI18N
+        examplesButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                examplesButtonActionPerformed(evt);
+            }
+        });
+
         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
         this.setLayout(layout);
         layout.setHorizontalGroup(
@@ -174,15 +317,20 @@ public final class CheckRegexTopComponent extends TopComponent {
                     .addComponent(exampleLabel)
                     .addGroup(layout.createSequentialGroup()
                         .addComponent(regexScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE)
-                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addGap(62, 62, 62)
                         .addComponent(errorLabel))
-                    .addComponent(exampleLayeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
-                .addContainerGap(266, Short.MAX_VALUE))
+                    .addComponent(exampleLayeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(1, 1, 1)
+                        .addComponent(flagsButton)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(examplesButton)))
+                .addGap(266, 266, 266))
         );
         layout.setVerticalGroup(
             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
-                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addContainerGap()
                 .addComponent(regexLabel)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -192,7 +340,11 @@ public final class CheckRegexTopComponent extends TopComponent {
                 .addComponent(exampleLabel)
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                 .addComponent(exampleLayeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addContainerGap())
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(flagsButton)
+                    .addComponent(examplesButton))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
     }// </editor-fold>//GEN-END:initComponents
 
@@ -211,17 +363,144 @@ public final class CheckRegexTopComponent extends TopComponent {
         matchPattern();
     }//GEN-LAST:event_strictCheckBoxItemStateChanged
 
+    private void flagsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_flagsButtonActionPerformed
+        if(flagsPopupMenu.isVisible()){
+            flagsPopupMenu.setVisible(false);
+        }else{
+            flagsPopupMenu.show(flagsButton, 0, (int) (0 - flagsPopupMenu.getPreferredSize().getHeight()));
+        }
+    }//GEN-LAST:event_flagsButtonActionPerformed
+
+    private void caseInsensitiveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_caseInsensitiveMenuItemActionPerformed
+        if(caseInsensitiveMenuItem.isSelected()){
+            Flags |= Pattern.CASE_INSENSITIVE;
+        }else{
+            Flags &= ~Pattern.CASE_INSENSITIVE;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_caseInsensitiveMenuItemActionPerformed
+
+    private void multilineMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_multilineMenuItemActionPerformed
+        if(multilineMenuItem.isSelected()){
+            Flags |= Pattern.MULTILINE;
+        }else{
+            Flags &= ~Pattern.MULTILINE;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_multilineMenuItemActionPerformed
+
+    private void dotAllMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dotAllMenuItemActionPerformed
+        if(dotAllMenuItem.isSelected()){
+            Flags |= Pattern.DOTALL;
+        }else{
+            Flags &= ~Pattern.DOTALL;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_dotAllMenuItemActionPerformed
+
+    private void unicodeCaseMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unicodeCaseMenuItemActionPerformed
+        if(unicodeCaseMenuItem.isSelected()){
+            Flags |= Pattern.UNICODE_CASE;
+        }else{
+            Flags &= ~Pattern.UNICODE_CASE;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_unicodeCaseMenuItemActionPerformed
+
+    private void unicodeCharacterClassMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unicodeCharacterClassMenuItemActionPerformed
+        if(unicodeCharacterClassMenuItem.isSelected()){
+            Flags |= Pattern.UNICODE_CHARACTER_CLASS;
+        }else{
+            Flags &= ~Pattern.UNICODE_CHARACTER_CLASS;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_unicodeCharacterClassMenuItemActionPerformed
+
+    private void commentsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commentsMenuItemActionPerformed
+        if(commentsMenuItem.isSelected()){
+            Flags |= Pattern.COMMENTS;
+        }else{
+            Flags &= ~Pattern.COMMENTS;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_commentsMenuItemActionPerformed
+
+    private void literalMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_literalMenuItemActionPerformed
+        if(literalMenuItem.isSelected()){
+            Flags |= Pattern.LITERAL;
+        }else{
+            Flags &= ~Pattern.LITERAL;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_literalMenuItemActionPerformed
+
+    private void unixLinesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unixLinesMenuItemActionPerformed
+        if(unixLinesMenuItem.isSelected()){
+            Flags |= Pattern.UNIX_LINES;
+        }else{
+            Flags &= ~Pattern.UNIX_LINES;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_unixLinesMenuItemActionPerformed
+
+    private void canonEqMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_canonEqMenuItemActionPerformed
+        if(canonEqMenuItem.isSelected()){
+            Flags |= Pattern.CANON_EQ;
+        }else{
+            Flags &= ~Pattern.CANON_EQ;
+        }
+        flagsPopupMenu.show(flagsButton, 0, 0 - flagsPopupMenu.getHeight());
+        matchPattern();
+    }//GEN-LAST:event_canonEqMenuItemActionPerformed
+
+    private void examplesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_examplesButtonActionPerformed
+        
+        Pattern p;
+        try {
+            p = Pattern.compile(regexTextArea.getText());
+        } catch (PatternSyntaxException pse) {
+            errorLabel.setText(Bundle.CheckRegexTopComponent_label_error(pse.getDescription()));
+            return;
+        }
+        RegexExampleAction regexExampleAction = new RegexExampleAction();
+        regexExampleAction.actionPerformed(evt);
+    }//GEN-LAST:event_examplesButtonActionPerformed
+
     // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JCheckBoxMenuItem canonEqMenuItem;
+    private javax.swing.JCheckBoxMenuItem caseInsensitiveMenuItem;
+    private javax.swing.JCheckBoxMenuItem commentsMenuItem;
+    private javax.swing.JCheckBoxMenuItem dotAllMenuItem;
     private javax.swing.JLabel errorLabel;
     private javax.swing.JLabel exampleLabel;
     private javax.swing.JLayeredPane exampleLayeredPane;
     private javax.swing.JScrollPane exampleScrollPane;
     private javax.swing.JTextArea exampleTextArea;
+    private javax.swing.JButton examplesButton;
+    private javax.swing.JFrame examplesFrame;
+    private javax.swing.JButton flagsButton;
+    private javax.swing.JPopupMenu flagsPopupMenu;
     private javax.swing.JLabel iconLabel;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JTextArea jTextArea1;
+    private javax.swing.JCheckBoxMenuItem literalMenuItem;
+    private javax.swing.JCheckBoxMenuItem multilineMenuItem;
     private javax.swing.JLabel regexLabel;
+    private javax.swing.JLabel regexLabel1;
     private javax.swing.JScrollPane regexScrollPane;
     private javax.swing.JTextArea regexTextArea;
     private javax.swing.JCheckBox strictCheckBox;
+    private javax.swing.JCheckBoxMenuItem unicodeCaseMenuItem;
+    private javax.swing.JCheckBoxMenuItem unicodeCharacterClassMenuItem;
+    private javax.swing.JCheckBoxMenuItem unixLinesMenuItem;
     // End of variables declaration//GEN-END:variables
     @Override
     public void componentOpened() {
@@ -299,7 +578,7 @@ public final class CheckRegexTopComponent extends TopComponent {
         }
         Pattern p;
         try {
-            p = Pattern.compile(regexTextArea.getText());
+            p = Pattern.compile(regexTextArea.getText(), Flags);
         } catch (PatternSyntaxException pse) {
             errorLabel.setText(Bundle.CheckRegexTopComponent_label_error(pse.getDescription()));
             return;
@@ -322,7 +601,12 @@ public final class CheckRegexTopComponent extends TopComponent {
                 while (m.find()) {
                     int start = m.start();
                     int end = m.end();
-                    DefaultHighlighter.DefaultHighlightPainter defaultHighlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
+                    DefaultHighlighter.DefaultHighlightPainter defaultHighlightPainter;
+                    if(count%2 == 0){
+                        defaultHighlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
+                    }else{
+                        defaultHighlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
+                    }
                     highlighter.addHighlight(start, end, defaultHighlightPainter);
                     count++;
                 }
@@ -338,4 +622,9 @@ public final class CheckRegexTopComponent extends TopComponent {
             }
         }
     }
+    
+    public String getExpression(){
+        return regexTextArea.getText();
+    }
+    
 }
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.form b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.form
new file mode 100644
index 0000000000..8b207b0f8a
--- /dev/null
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.form
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="exampleScrollPane" pref="380" max="32767" attributes="0"/>
+                  <Group type="102" attributes="0">
+                      <Component id="regExLabel" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="expressionLabel" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="32767" attributes="0"/>
+                      <Component id="NoLabel" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="numberField" min="-2" pref="42" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="regenerateButton" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="regExLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="expressionLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="numberField" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="NoLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="exampleScrollPane" min="-2" pref="207" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="regenerateButton" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="regExLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="RegexExampleVisualPanel1.regExLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Container class="javax.swing.JScrollPane" name="exampleScrollPane">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTextArea" name="exampleTextArea">
+          <Properties>
+            <Property name="columns" type="int" value="20"/>
+            <Property name="rows" type="int" value="5"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JLabel" name="expressionLabel">
+    </Component>
+    <Component class="javax.swing.JTextField" name="numberField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="RegexExampleVisualPanel1.numberField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="NoLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="RegexExampleVisualPanel1.NoLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="regenerateButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/java/hints/jdk/Bundle.properties" key="RegexExampleVisualPanel1.regenerateButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="regenerateButtonActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.java b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.java
new file mode 100644
index 0000000000..d661631911
--- /dev/null
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/jdk/RegexExampleVisualPanel1.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.jdk;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import javax.swing.JPanel;
+import org.netbeans.modules.java.hints.regex.parser.ExampleGenerator;
+import org.netbeans.modules.java.hints.regex.parser.RegExParser;
+import org.netbeans.modules.java.hints.regex.parser.RegexConstructs.RegEx;
+import org.openide.DialogDescriptor;
+import org.openide.DialogDisplayer;
+import org.openide.util.NbBundle;
+
+public final class RegexExampleVisualPanel1 extends JPanel {
+    
+    private final String expression;
+    /**
+     * Creates new form RegexExampleVisualPanel1
+     */
+    public RegexExampleVisualPanel1() {
+        initComponents();
+        this.expression = CheckRegexTopComponent.findInstance().getExpression();
+        expressionLabel.setText(expression);
+        exampleTextArea.setText(getExamples());
+    }
+
+    @Override
+    public String getName() {
+        return NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.REGEX_EXAMPLES");
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        regExLabel = new javax.swing.JLabel();
+        exampleScrollPane = new javax.swing.JScrollPane();
+        exampleTextArea = new javax.swing.JTextArea();
+        expressionLabel = new javax.swing.JLabel();
+        numberField = new javax.swing.JTextField();
+        NoLabel = new javax.swing.JLabel();
+        regenerateButton = new javax.swing.JButton();
+
+        org.openide.awt.Mnemonics.setLocalizedText(regExLabel, org.openide.util.NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.regExLabel.text")); // NOI18N
+
+        exampleTextArea.setColumns(20);
+        exampleTextArea.setRows(5);
+        exampleScrollPane.setViewportView(exampleTextArea);
+
+        numberField.setText(org.openide.util.NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.numberField.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(NoLabel, org.openide.util.NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.NoLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(regenerateButton, org.openide.util.NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.regenerateButton.text")); // NOI18N
+        regenerateButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                regenerateButtonActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(exampleScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(regExLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(expressionLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                        .addComponent(NoLabel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(numberField, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(regenerateButton)
+                        .addGap(0, 0, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(regExLabel)
+                    .addComponent(expressionLabel)
+                    .addComponent(numberField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(NoLabel))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(exampleScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(regenerateButton)
+                .addContainerGap())
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void regenerateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_regenerateButtonActionPerformed
+        exampleTextArea.setText(getExamples());
+    }//GEN-LAST:event_regenerateButtonActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel NoLabel;
+    private javax.swing.JScrollPane exampleScrollPane;
+    private javax.swing.JTextArea exampleTextArea;
+    private javax.swing.JLabel expressionLabel;
+    private javax.swing.JTextField numberField;
+    private javax.swing.JLabel regExLabel;
+    private javax.swing.JButton regenerateButton;
+    // End of variables declaration//GEN-END:variables
+
+    private String getExamples() {     
+        RegExParser r = new RegExParser(expression);        
+        RegEx p = r.parse();        
+        ExampleGenerator eg = new ExampleGenerator(p);
+        int noFieldVal = 0;
+        try{
+         noFieldVal = Integer.parseInt(numberField.getText());    
+        }catch(NumberFormatException e){
+            return NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.exampleTextArea.invalidText");
+        }    
+        ArrayList<String> generate = eg.generate(noFieldVal); 
+        StringBuilder sb = new StringBuilder();        
+        generate.forEach(example -> {
+            sb.append(example + "\n");
+        });        
+        return sb.toString();
+    }
+}
+
+final class RegexExampleAction implements ActionListener {
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        DialogDescriptor dd = new DialogDescriptor(new RegexExampleVisualPanel1(), NbBundle.getMessage(RegexExampleVisualPanel1.class, "RegexExampleVisualPanel1.REGEX_EXAMPLES"));        
+        dd.setOptions(new Object[0]);
+        DialogDisplayer.getDefault().notify(dd);
+    }
+
+}
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/ExampleGenerator.java b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/ExampleGenerator.java
new file mode 100644
index 0000000000..2234ab74d3
--- /dev/null
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/ExampleGenerator.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.regex.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import org.netbeans.modules.java.hints.regex.parser.RegexConstructs.*;
+
+/**
+ *
+ * @author sandeemi
+ */
+public class ExampleGenerator {
+
+    private final RegEx regEx;
+    private Random rnd;
+
+    private boolean DOT_ALL = false;
+
+    public ExampleGenerator(RegEx regEx) {
+        this.rnd = new Random();
+        this.regEx = regEx;
+    }
+
+    public void setDOT_ALL(boolean DOT_ALL) {
+        this.DOT_ALL = DOT_ALL;
+    }
+
+    public ArrayList<String> generate(int n) {
+
+        ArrayList<String> result = new ArrayList<>();
+
+        for (int i = 0; i < n; i++) {
+            StringBuilder sb = new StringBuilder();
+            buildExample(regEx, sb);
+            result.add(sb.toString());
+        }
+
+        return result;
+    }
+
+    private void buildExample(RegEx regex, StringBuilder sb) {
+
+        if (regex instanceof Blank) {
+            return;
+        }
+
+        if (regex instanceof Primitive) {
+            sb.append(((Primitive) regex).getCh());
+            return;
+        }
+
+        if (regex instanceof Repetition) {
+            int nextInt = rnd.nextInt(10);
+            RegEx internal = ((Repetition) regex).getInternal();
+
+            for (int i = 0; i < nextInt; i++) {
+                buildExample(internal, sb);
+            }
+
+            return;
+        }
+
+        if (regex instanceof OneOrMore) {
+            int nextInt = rnd.nextInt(10) + 1;
+
+            RegEx internal = ((OneOrMore) regex).getInternal();
+
+            for (int i = 0; i < nextInt; i++) {
+                buildExample(internal, sb);
+            }
+
+            return;
+        }
+
+        if (regex instanceof Group) {
+            if (regex instanceof SpecialConstructGroup) {
+                GroupType groupType = ((SpecialConstructGroup) regex).getGroupType();
+                if (groupType.isNegative() || groupType.isPositive()) {
+                    return;
+                }
+            }
+            RegEx internal = ((Group) regex).getInternal();
+            buildExample(internal, sb);
+
+            return;
+        }
+        if (regex instanceof Optional) {
+            boolean nextBool = rnd.nextBoolean();
+
+            RegEx internal = ((Optional) regex).getInternal();
+
+            if (nextBool) {
+                buildExample(internal, sb);
+            }
+
+            return;
+        }
+
+        if (regex instanceof GreedyBound) {
+
+            RegEx internal = ((GreedyBound) regex).getInternal();
+            int min = ((GreedyBound) regex).getMin();
+            boolean maxPresent = ((GreedyBound) regex).isMaxPresent();
+            int max = ((GreedyBound) regex).getMax();
+
+            int nextInt;
+
+            if (maxPresent) {
+                nextInt = rnd.nextInt(max - min + 1) + min;
+            } else {
+                nextInt = rnd.nextInt(10) + min;
+            }
+
+            for (int i = 0; i < nextInt; i++) {
+                buildExample(internal, sb);
+            }
+
+            return;
+        }
+
+        if (regex instanceof AnyChar) {
+            int nextInt = rnd.nextInt(126 - 32) + 32;
+            sb.append((char) nextInt);
+            return;
+        }
+
+        if (regex instanceof CharClass) {
+
+            CharClass charClass = (CharClass) regex;
+            List<Character> charClassList = charClass.isNegation() ? charClass.getNegationList() : charClass.getAllChar();
+
+            int n = charClassList.size();
+            sb.append(charClassList.get(rnd.nextInt(n)));
+
+            return;
+        }
+
+        if (regex instanceof Range) {
+            char from = ((Range) regex).getFrom();
+            char to = ((Range) regex).getTo();
+
+            int length = to - from;
+
+            sb.append((char) (from + rnd.nextInt(length + 1)));
+
+            return;
+        }
+
+        if (regex instanceof Choice) {
+            ArrayList<RegEx> choices = ((Choice) regex).getChoice();
+
+            int n = choices.size();
+
+            buildExample(choices.get(rnd.nextInt(n)), sb);
+
+            return;
+        }
+
+        if (regex instanceof Concat) {
+            ArrayList<RegEx> concatNodes = ((Concat) regex).getConcat();
+            concatNodes.forEach((RegEx nodes) -> {
+                buildExample(nodes, sb);
+            });
+
+        }
+    }
+}
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegExParser.java b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegExParser.java
new file mode 100644
index 0000000000..d139e1116a
--- /dev/null
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegExParser.java
@@ -0,0 +1,503 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.regex.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import org.netbeans.modules.java.hints.regex.parser.RegexConstructs.*;
+
+/**
+ *
+ * @author sandeemi
+ */
+public class RegExParser {
+
+    private final String input;
+    private int pos;
+    private int groupNo;
+    private HashMap<Integer, RegEx> groupMap;
+    private HashMap<String, RegEx> namedGroupMap;
+
+    private static final char OR = '|';
+    private static final char AND = '&';
+    private static final char NOT = '^';
+    private static final char DASH = '-';
+    private static final char DOT = '.';
+    private static final char ESCAPE = '\\';
+    private static final char COMMA = ',';
+    private static final char EQUAL = '=';
+    private static final char EXCLM = '!';
+    private static final char COLON = ':';
+
+    private static final char OPT = '?';
+    private static final char STAR = '*';
+    private static final char PLUS = '+';
+    private static final char PAR_OP = '(';
+    private static final char PAR_CL = ')';
+    private static final char CLASS_OP = '[';
+    private static final char CLASS_CL = ']';
+    private static final char BRAC_OP = '{';
+    private static final char BRAC_CL = '}';    
+    private static final char NAMED_OP = '<';
+    private static final char NAMED_CL = '>';
+    private static final char QUOT_OP = 'Q';
+    private static final char QUOT_CL = 'E';
+
+    private static final char[] DIGIT = "0123456789".toCharArray();
+    private static final char[] BOUNDRY_MATCHERS = "bBAGzZ".toCharArray();
+    private static final char[] OPEN_LOOP = new char[]{OPT, STAR, PLUS, BRAC_OP};
+
+    public RegExParser(String input) {
+        this.input = input;
+        this.pos = 0;
+        this.groupNo = 0;
+        this.groupMap = new HashMap<>();
+        this.namedGroupMap = new HashMap<>();
+    }
+
+    public RegEx parse() {
+        if (input == null) {
+            return null;
+        } else if (input.isEmpty()) {
+            return new Blank();
+        } else {
+            return regex();
+        }
+    }
+
+    /*Recursive descent parsing internals*/
+    private char peek() {
+        return input.charAt(pos);
+    }
+
+    private void eat(char c) {
+        if (peek() == c) {
+            pos++;
+        } else {
+            throw new RuntimeException("Expected: " + c + "; got: " + peek());
+        }
+    }
+
+    private char next() {
+        char c = peek();
+        eat(c);
+        return c;
+    }
+
+    private char nextChar() {
+        return input.charAt(pos + 1);
+    }
+
+    private boolean nextIn(char[] arr) {
+        if (more()) {
+            char c = peek();
+            for (char a : arr) {
+                if (c == a) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean more() {
+        return pos < input.length();
+    }
+
+    /*Regular expression term types*/
+    private RegEx regex() {
+        RegEx term = term();
+
+        while (more() && peek() == OR) {
+            eat('|');
+            term = Choice.subChoices(term, term());
+        }
+        return term;
+    }
+
+    private RegEx term() {
+        RegEx factor = new Blank();
+
+        while (more() && peek() != PAR_CL && peek() != '|') {
+            RegEx nextFactor = factor();
+            factor = new Sequence(factor, nextFactor);
+        }
+
+        factor = flatten(factor);
+
+        return factor;
+    }
+
+    private RegEx factor() {
+
+        RegEx base = base();
+
+        while (more() && nextIn(OPEN_LOOP)) {
+            switch (peek()) {
+                case PLUS:
+                    base = new OneOrMore(base);
+                    eat(PLUS);
+                    if (more() && peek() == OPT) {
+                        eat(OPT);
+                    } else if (more() && peek() == PLUS) {
+                        eat(PLUS);
+                    }
+                    break;
+                case STAR:
+                    base = new Repetition(base);
+                    eat(STAR);
+                    if (more() && peek() == OPT) {
+                        eat(OPT);
+                    } else if (more() && peek() == PLUS) {
+                        eat(PLUS);
+                    }
+                    break;
+                case OPT:
+                    base = new Optional(base);
+                    eat(OPT);
+                    // TODO: case for z?+Z
+                    if (more() && peek() == OPT) {
+                        eat(OPT);
+                    } else if (more() && peek() == PLUS) {
+                        eat(PLUS);
+                    }
+                    break;
+                case BRAC_OP:
+                    base = greedyBound(base);
+                    break;
+            }
+        }
+
+        return base;
+    }
+
+    private RegEx base() {
+
+        switch (peek()) {
+            case CLASS_OP:
+                eat(CLASS_OP);
+                RegEx c = charClass(false);
+                eat(CLASS_CL);
+                return c;
+            case PAR_OP:
+                return handleParenthesis();
+            case '\\':
+                return handleEscape();
+            case DOT:
+                eat(DOT);
+                return new AnyChar();
+            case '^':
+                eat('^');
+                return new Blank();
+            case '$':
+                eat('$');
+                return new Blank();
+            default:
+                return new Primitive(next());
+        }
+    }
+
+    private RegEx handleParenthesis() {
+        eat(PAR_OP);
+        groupNo++;
+        RegEx r = null;
+        if (peek() == OPT) {
+            next();
+            StringBuilder name = new StringBuilder();
+            switch (peek()) {
+                case NAMED_OP:
+                    next();
+                    switch (peek()) {
+                        case EQUAL:
+                            next();
+                            r = new SpecialConstructGroup(GroupType.POSITIVE_LOOKBEHIND, regex());
+                            break;
+                        case EXCLM:
+                            next();
+                            r = new SpecialConstructGroup(GroupType.NEGATIVE_LOOKBEHIND, regex());
+                            break;
+                        default:
+                            while (peek() != NAMED_CL) {
+                                name.append(next());
+                            }
+                            next();
+                            r = new NamedGroup(groupNo, name.toString(), regex(), this);
+                            break;
+                    }
+                    break;
+                case EQUAL:
+                    next();
+                    r = new SpecialConstructGroup(GroupType.POSITIVE_LOOKAHEAD, regex());
+                    break;
+                case EXCLM:
+                    next();
+                    r = new SpecialConstructGroup(GroupType.NEGATIVE_LOOKAHEAD, regex());
+                    break;
+                case COLON: 
+                    next();
+                    groupNo--;
+                    r = new SpecialConstructGroup(GroupType.NON_CAPTURE_GROUP, regex());
+                    break;
+                
+            }
+        } else {
+            r = new CapturingGroup(groupNo, regex(), this);
+        }
+        eat(PAR_CL);
+        return r;
+    }
+
+    private RegEx handleEscape() throws NumberFormatException, RuntimeException {
+        eat('\\');
+        if (nextIn(BOUNDRY_MATCHERS)) {
+            next();
+            return new Blank();
+        }
+        if (nextIn(DIGIT)) {
+            String number = "";
+            int n = getGroupMap().size();
+            while (more() && nextIn(DIGIT)) {
+                int parseInt = Integer.parseInt(String.valueOf(number + peek()));
+                if (parseInt <= n) {
+                    number += next();
+                } else {
+                    break;
+                }
+            }
+            int num = Integer.parseInt(String.valueOf(number));
+
+            return getGroupMap().get(num);
+        }
+        char esc = next();
+        if (esc == QUOT_OP) {
+            return handleQuotations();
+        }
+        if (esc == 'p' && peek() == BRAC_OP) {
+            StringBuilder s = new StringBuilder();
+            eat(BRAC_OP);
+            while (peek() != BRAC_CL) {
+                s.append(next());
+            }
+            eat(BRAC_CL);
+            return handlePosix(s.toString());
+        }
+        if (esc == 'k' && peek() == NAMED_OP) {
+            StringBuilder s = new StringBuilder();
+            next();
+            while (peek() != NAMED_CL) {
+                s.append(next());
+            }
+            next();
+            return getNamedGroupMap().get(s.toString());
+        }
+        if (SpecialChar.sChars.containsKey(esc)) {
+            return SpecialChar.sChars.get(esc);
+        }
+        return new Primitive(esc);
+    }
+
+    private RegEx handleQuotations() throws RuntimeException {
+        ArrayList<RegEx> quotations = new ArrayList<>();
+        while (!(peek() == ESCAPE && nextChar() == QUOT_CL)) {
+            char quot = next();
+            quotations.add(new Primitive(quot));
+        }
+        eat(ESCAPE);
+        eat(QUOT_CL);
+        if (nextIn(OPEN_LOOP)) {
+            throw new RuntimeException(this.input + " token not Quantifiable at " + (pos - 1));
+        }
+        return new Concat(quotations);
+    }
+
+    private RegEx charClass(boolean isIntersection) {
+        CharClass charClass;
+        if (peek() == NOT) {
+            eat(NOT);
+            charClass = new CharClass(true, isIntersection);
+        } else {
+            charClass = new CharClass(false, isIntersection);
+        }
+        if (peek() == CLASS_CL || peek() == DASH) {
+            charClass.addToClass(new Primitive(peek()));
+            next();
+        }
+        while (peek() != CLASS_CL) {
+            if (nextChar() == DASH) {
+                char from = peek();
+                eat(from);
+                next();
+                if (peek() == CLASS_CL) {
+                    charClass.addToClass(new Primitive(DASH));
+                } else {
+                    char to = peek();
+                    eat(to);
+                    charClass.addToClass(new Range(from, to));
+                }
+            } else if (peek() == CLASS_OP) {
+                eat(CLASS_OP);
+                RegEx c = charClass(false);
+                eat(CLASS_CL);
+                charClass.addToClass(c);
+            } else if (peek() == AND) {
+                next();
+                if (peek() == AND) {
+                    next();
+                    if (peek() == CLASS_OP) {
+                        eat(CLASS_OP);
+                        RegEx c = charClass(true);
+                        eat(CLASS_CL);
+                        charClass.addToClass(c);
+                    }
+                } else {
+                    charClass.addToClass(new Primitive(AND));
+                }
+            }else if(peek() == ESCAPE && SpecialChar.sChars.containsKey(nextChar())) {
+                next();
+                charClass.addToClass(SpecialChar.sChars.get(peek()));
+                next();
+            }else{
+                charClass.addToClass(new Primitive(next()));
+            }
+        }
+        return charClass;
+    }
+
+    private RegEx greedyBound(RegEx base) {
+        GreedyBound gr = new GreedyBound(base);
+        eat(BRAC_OP);
+        String number = "";
+        while (peek() != BRAC_CL && peek() != COMMA) {
+            number += next();
+        }
+        int min = Integer.parseInt(String.valueOf(number));
+        gr.setMin(min);
+
+        int max;
+        if (peek() == COMMA) {
+            eat(COMMA);
+            if (nextIn(DIGIT)) {
+                number = "";
+                while (peek() != BRAC_CL) {
+                    number += next();
+                }
+                gr.setMaxPresent(true);
+                max = Integer.parseInt(String.valueOf(number));
+                gr.setMax(max);
+            } else {
+                gr.setMaxPresent(false);
+            }
+        } else if (peek() == BRAC_CL) {
+            gr.setMaxPresent(true);
+            gr.setMax(min);
+        }
+
+        eat(BRAC_CL);
+        return gr;
+    }
+
+    private RegEx flatten(RegEx factor) {
+        ArrayList<RegEx> flattenedList = new ArrayList<>();
+        Sequence factorCopy = (Sequence) factor;
+
+        while (factorCopy.firstSeq != null && (factorCopy.firstSeq instanceof Sequence)) {
+            flattenedList.add(0, factorCopy.secondSeq);
+            factorCopy = (Sequence) factorCopy.firstSeq;
+        }
+
+        flattenedList.add(0, factorCopy.secondSeq);
+
+        if (flattenedList.size() == 1) {
+            return flattenedList.get(0);
+        }
+
+        return new Concat(flattenedList);
+    }
+
+    private Posix handlePosix(String posix) {
+        Posix posixClass;
+
+        posixClass = new Posix(posix, false, false);
+        switch (posix) {
+            case "Lower":
+                posixClass.addToClass(new Range('a', 'z'));
+                break;
+            case "Upper":
+                posixClass.addToClass(new Range('A', 'Z'));
+                break;
+            case "ASCII":
+                posixClass.addToClass(new Range((char) 0x00, (char) 0x7F));
+                break;
+            case "Alpha":
+                posixClass.addToClass(handlePosix("Lower"), handlePosix("Upper"));
+                break;
+            case "Digit":
+                posixClass.addToClass(new Range('0', '9'));
+                break;
+            case "Alnum":
+                posixClass.addToClass(handlePosix("Alpha"), handlePosix("Digit"));
+                break;
+            case "Punct":
+                String punctuations = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+                for (int i = 0; i < punctuations.length(); i++) {
+                    posixClass.addToClass(new Primitive(punctuations.charAt(i)));
+                }
+                break;
+            case "Graph":
+                posixClass.addToClass(handlePosix("Alnum"), handlePosix("Punct"));
+                break;
+            case "Print":
+                posixClass.addToClass(handlePosix("Graph"), new Primitive((char) 0x20));
+                break;
+            case "Blank":
+                posixClass.addToClass(new Primitive(' '), new Primitive('\t'));
+                break;
+            case "Cntrl":
+                posixClass.addToClass(new Range((char) 0x00, (char) 0x1F), new Primitive((char) 0x7F));
+                break;
+            case "XDigit":
+                posixClass.addToClass(new Range('0', '9'), new Range('a', 'f'), new Range('A', 'F'));
+                break;
+            case "Space":
+                posixClass.addToClass(new Primitive(' '), new Primitive('\t'), new Primitive('\n'), new Primitive((char) 0x0B), new Primitive('\f'), new Primitive('\r'));
+                break;
+            default:
+                break;
+        }
+
+        return posixClass;
+    }
+
+    public HashMap<String, RegEx> getNamedGroupMap() {
+        return namedGroupMap;
+    }
+
+    public void setNamedGroupMap(HashMap<String, RegEx> namedGroupMap) {
+        this.namedGroupMap = namedGroupMap;
+    }
+
+    public HashMap<Integer, RegEx> getGroupMap() {
+        return groupMap;
+    }
+
+    public void setGroupMap(HashMap<Integer, RegEx> groupMap) {
+        this.groupMap = groupMap;
+    }
+
+}
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegexConstructs.java b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegexConstructs.java
new file mode 100644
index 0000000000..4498121337
--- /dev/null
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/regex/parser/RegexConstructs.java
@@ -0,0 +1,495 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.regex.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+/**
+ *
+ * @author SANDEEMI
+ */
+public class RegexConstructs {
+
+    public static abstract class RegEx {
+
+    }
+
+    public static class AnyChar extends RegEx {
+
+    }
+
+    public static class Blank extends RegEx {
+
+    }
+
+    public static class CharClass extends RegEx {
+
+        private final boolean isNegation;
+        private final boolean isIntersection;
+        private final List<RegEx> charClassList;
+        private final List<Character> allChars;
+        private final List<Character> negationChars;
+
+        public CharClass(boolean isNegation, boolean isIntersection) {
+            this.isNegation = isNegation;
+            this.isIntersection = isIntersection;
+            this.charClassList = new ArrayList<>();
+            allChars = new ArrayList<>();
+            negationChars = new ArrayList<>();
+            for (int c = 32; c <= 126; c++) {
+                negationChars.add((char) c);
+            }
+        }
+
+        public void addToClass(RegEx... nextChar) {
+            for (RegEx next : nextChar) {
+                this.charClassList.add(next);
+                if (next instanceof Primitive) {
+                    allChars.add((Character) ((Primitive) next).getCh());
+                    negationChars.remove((Character) ((Primitive) next).getCh());
+                } else if (next instanceof Range) {
+                    char from = ((Range) next).getFrom();
+                    char to = ((Range) next).getTo();
+                    for (char c = from; c <= to; c++) {
+                        allChars.add((Character) c);
+                        negationChars.remove((Character) c);
+                    }
+                } else if (next instanceof CharClass) {
+                    CharClass charClass = (CharClass) next;
+                    if (charClass.isIntersection) {
+                        handleIntersection(charClass);
+                    } else {
+                        handleUnion(charClass);
+                    }
+                }
+            }
+        }
+
+        private void handleUnion(CharClass charClass) {
+            List<Character> allCharInt;
+            if (charClass.isNegation()) {
+                allCharInt = charClass.getNegationList();
+            } else {
+                allCharInt = charClass.getAllChar();
+            }
+            ListIterator<Character> listIterator = allCharInt.listIterator();
+            while (listIterator.hasNext()) {
+                Character c = listIterator.next();
+                if (!allChars.contains(c)) {
+                    allChars.add(c);
+                    negationChars.remove(c);
+                }
+            }
+        }
+
+        private void handleIntersection(CharClass charClass) {
+
+            List<Character> allCharInt;
+            if (charClass.isNegation()) {
+                allCharInt = charClass.getNegationList();
+            } else {
+                allCharInt = charClass.getAllChar();
+            }
+            ListIterator<Character> listIterator = allChars.listIterator();
+            while (listIterator.hasNext()) {
+                Character c = listIterator.next();
+                if (!allCharInt.contains(c)) {
+                    listIterator.remove();
+                    negationChars.add(c);
+                }
+            }
+        }
+
+        public boolean isNegation() {
+            return isNegation;
+        }
+
+        public List<RegEx> getCharClassList() {
+            return charClassList;
+        }
+
+        public List<Character> getAllChar() {
+            return allChars;
+        }
+
+        public List<Character> getNegationList() {
+            return negationChars;
+        }
+    }
+
+    public static class CapturingGroup extends Group {
+
+        private int groupNo;
+
+        public CapturingGroup(int groupNo, RegEx regex, RegExParser regExParser) {
+            super(regex);
+            this.groupNo = groupNo;
+            regExParser.getGroupMap().put(groupNo, regex);
+        }
+
+        public int getGroupNo() {
+            return groupNo;
+        }
+
+        public void setGroupNo(int groupNo) {
+            this.groupNo = groupNo;
+        }
+    }
+
+    public static class Choice extends RegEx {
+
+        private ArrayList<RegEx> choice;
+
+        public Choice(ArrayList<RegEx> choice) {
+            this.choice = choice;
+        }
+
+        public static Choice subChoices(RegEx... regex) {
+            ArrayList<RegEx> alternatives = new ArrayList<>();
+            for (RegEx r : regex) {
+                if (r instanceof Choice) {
+                    alternatives.addAll(((Choice) r).getChoice());
+                } else {
+                    alternatives.add(r);
+                }
+            }
+
+            return new Choice(alternatives);
+        }
+
+        public ArrayList<RegEx> getChoice() {
+            return choice;
+        }
+
+        public void setChoice(ArrayList<RegEx> choice) {
+            this.choice = choice;
+        }
+    }
+
+    public static class Concat extends RegEx {
+
+        private ArrayList<RegEx> concat;
+
+        public ArrayList<RegEx> getConcat() {
+            return concat;
+        }
+
+        public void setConcat(ArrayList<RegEx> concat) {
+            this.concat = concat;
+        }
+
+        public Concat(ArrayList<RegEx> seq) {
+            this.concat = seq;
+        }
+    }
+
+    public static class GreedyBound extends RegEx {
+
+        private final RegEx internal;
+        private int min;
+        private boolean maxPresent;
+        private int max;
+
+        public boolean isMaxPresent() {
+            return maxPresent;
+        }
+
+        public void setMaxPresent(boolean maxPresent) {
+            this.maxPresent = maxPresent;
+        }
+
+        public GreedyBound(RegEx base) {
+            this.internal = base;
+        }
+
+        public int getMin() {
+            return min;
+        }
+
+        public void setMin(int min) {
+            this.min = min;
+        }
+
+        public int getMax() {
+            return max;
+        }
+
+        public void setMax(int max) {
+            this.max = max;
+        }
+
+        public RegEx getInternal() {
+            return internal;
+        }
+
+    }
+
+    public static class Group extends RegEx {
+
+        private RegEx internal;
+
+        public Group(RegEx regex) {
+            this.internal = regex;
+        }
+
+        public RegEx getInternal() {
+            return internal;
+        }
+
+        public void setInternal(RegEx internal) {
+            this.internal = internal;
+        }
+
+    }
+
+    public static enum GroupType {
+        POSITIVE_LOOKAHEAD,
+        NEGATIVE_LOOKAHEAD,
+        POSITIVE_LOOKBEHIND,
+        NEGATIVE_LOOKBEHIND,
+        CAPTURE_GROUP,
+        NON_CAPTURE_GROUP;
+
+        public boolean isNegative() {
+            return this == NEGATIVE_LOOKAHEAD || this == NEGATIVE_LOOKBEHIND;
+        }
+
+        public boolean isPositive() {
+            return this == POSITIVE_LOOKAHEAD || this == POSITIVE_LOOKBEHIND;
+        }
+    }
+
+    public static class NamedGroup extends CapturingGroup {
+
+        private String groupName;
+
+        public NamedGroup(int groupNo, String groupName, RegEx regex, RegExParser regExParser) {
+            super(groupNo, regex, regExParser);
+            this.groupName = groupName;
+            regExParser.getNamedGroupMap().put(groupName, regex);
+        }
+
+        public String getGroupName() {
+            return groupName;
+        }
+
+        public void setGroupName(String groupName) {
+            this.groupName = groupName;
+        }
+
+    }
+
+    public static class OneOrMore extends RegEx {
+
+        private RegEx internal;
+
+        public OneOrMore(RegEx base) {
+            this.internal = base;
+        }
+
+        public RegEx getInternal() {
+            return internal;
+        }
+    }
+
+    public static class Optional extends RegEx {
+
+        private RegEx internal;
+
+        public Optional(RegEx base) {
+            this.internal = base;
+        }
+
+        public RegEx getInternal() {
+            return internal;
+        }
+
+    }
+
+    public static class Posix extends CharClass {
+
+        private String posixName;
+
+        public Posix(String posixName, boolean isNegation, boolean isIntersection) {
+            super(isNegation, isIntersection);
+            this.posixName = posixName;
+        }
+
+        public String getPosixName() {
+            return posixName;
+        }
+
+    }
+
+    public static class Primitive extends RegEx {
+
+        private char ch;
+
+        public Primitive(char esc) {
+            this.ch = esc;
+        }
+
+        public char getCh() {
+            return ch;
+        }
+    }
+
+    public static class Range extends RegEx {
+
+        private char from;
+        private char to;
+
+        public Range(char from, char to) {
+            this.from = from;
+            this.to = to;
+        }
+
+        public char getFrom() {
+            return from;
+        }
+
+        public char getTo() {
+            return to;
+        }
+
+    }
+
+    public static class Repetition extends RegEx {
+
+        private RegEx internal;
+
+        public Repetition(RegEx internal) {
+            this.internal = internal;
+        }
+
+        public RegEx getInternal() {
+            return internal;
+        }
+
+    }
+
+    public static class Sequence extends RegEx {
+
+        public final RegEx firstSeq;
+        public final RegEx secondSeq;
+
+        public Sequence(RegEx first, RegEx second) {
+            this.firstSeq = first;
+            this.secondSeq = second;
+        }
+
+    }
+
+    public static class SpecialChar {
+
+        public static Map<Character, RegEx> sChars = buildHashMap('t', new Primitive('\t'),
+                'n', new Primitive('\n'),
+                'r', new Primitive('\r'),
+                'f', new Primitive('\f'),
+                '\\', new Primitive('\\'),
+                's', buildWhiteSpaceEscape(false),
+                'd', buildDigitEscape(false),
+                'w', buildAlphaNumericEscape(false),
+                'S', buildWhiteSpaceEscape(true),
+                'D', buildDigitEscape(true),
+                'W', buildAlphaNumericEscape(true)
+        );
+
+        public static RegEx buildWhiteSpaceEscape(boolean negation) {
+
+            CharClass charClass = new CharClass(negation, false);
+
+            charClass.addToClass(new Primitive('\t'),
+                    new Primitive('\n'),
+                    new Primitive('\f'),
+                    new Primitive('\r'),
+                    new Primitive(' '));
+            return charClass;
+        }
+
+        public static RegEx buildDigitEscape(boolean negation) {
+            CharClass charClass = new CharClass(negation, false);
+            charClass.addToClass(new Range('0', '9'));
+            return charClass;
+        }
+
+        public static RegEx buildAlphaNumericEscape(boolean negation) {
+            CharClass charClass = new CharClass(false, false);
+            charClass.addToClass(new Range('1', '9'),
+                    new Range('a', 'z'),
+                    new Range('A', 'Z'),
+                    new Primitive('_'));
+
+            return charClass;
+        }
+
+        public static HashMap<Character, RegEx> buildHashMap(Object... data) {
+            HashMap<Character, RegEx> result = new HashMap<Character, RegEx>();
+
+            if (data.length % 2 != 0) {
+                throw new IllegalArgumentException("Odd number of arguments");
+            }
+
+            Character key = null;
+            Integer step = -1;
+
+            for (Object value : data) {
+                step++;
+                switch (step % 2) {
+                    case 0:
+                        if (value == null) {
+                            throw new IllegalArgumentException("Null key value");
+                        }
+                        key = (Character) value;
+                        continue;
+                    case 1:
+                        result.put(key, (RegEx) value);
+                        break;
+                }
+            }
+
+            return result;
+        }
+
+    }
+
+    public static class SpecialConstructGroup extends Group {
+
+        private GroupType groupType;
+
+        public GroupType getGroupType() {
+            return groupType;
+        }
+
+        public void setGroupType(GroupType groupType) {
+            this.groupType = groupType;
+        }
+
+        public SpecialConstructGroup(GroupType groupType, RegEx regex) {
+            super(regex);
+            this.groupType = groupType;
+        }
+
+    }
+
+}
diff --git a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/regex/parser/ExampleGeneratorTest.java b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/regex/parser/ExampleGeneratorTest.java
new file mode 100644
index 0000000000..ca5e938824
--- /dev/null
+++ b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/regex/parser/ExampleGeneratorTest.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.hints.regex.parser;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.netbeans.modules.java.hints.regex.parser.RegexConstructs.RegEx;
+
+/**
+ *
+ * @author SANDEEMI
+ */
+public class ExampleGeneratorTest {
+
+    public ExampleGeneratorTest() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+    }
+
+    @Before
+    public void setUp() {
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of generate method, of class ExampleGenerator.
+     */
+    @Test
+    public void testGenerate() throws IOException {
+
+        int n = 50;
+
+        List<String> regexps = Arrays.asList("z*",
+                "z+",
+                "z?",
+                "z{1}",
+                "z{1,2}",
+                "z{1,}",
+                "z?+t",
+                "a|b",
+                "ab",
+                "[^a-z]",
+                "\\d\\w\\s",
+                "\n\r\f\\\\",
+                "a|(b|c|d)|e",
+                "z*[1-9d-f](ab|bc|cd)\\d+",
+                "a*|b{2,4}",
+                "[\\s]",
+                "\\d+(\\.\\d\\d)?",
+                "rege(x(es)?|xps?)",
+                "[2-9]|[12]\\d|3[0-6]",
+                "([0-2][1-9]|3[01])-(0[1-9]|1[12])-(\\d{4})",
+                "[a-z_1-9]|\\Qabcd!@#$%^&*()1234[]?'\\E|(ab)+.",
+                "[a-z[q-s]]",
+                "[a-z1-9&&[^a-z]]",
+                "\\p{Lower}\\p{Punct}\\p{Graph}",
+                "^[a-z0-9_-]{3,15}$",
+                "(ab(cd(ef)))\\2\\3{2}\\1",
+                "(?<new>ab)(ba)\\k<new>{2}\\2\\1+",
+                "(ab{2,8}[^abcd])",
+                "ab(?!ef)",
+                "(ab(cd(?:ef(gh))))\\3",
+                "(?<!ab)cd",
+                "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+                "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$",
+                "([^\\s]+(\\.(jpg|png|gif|bmp))$)",
+                "(1[012]|[1-9]):[0-5][0-9](\\s)?(am|pm)",
+                "([01]?[0-9]|2[0-3]):[0-5][0-9]",
+                "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)",
+                "<(\"[^\"]*\"|'[^']*'|[^'\">])*>",
+                "<a([^>]+)>(.+?)</a>",
+                "\\s*href\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+));");
+        
+        for (String regex : regexps) {
+            if (regex.charAt(0) != '#') {
+                Pattern pat = Pattern.compile(regex, 0);
+                Matcher m;
+                RegExParser r = new RegExParser(regex);
+                RegEx p = r.parse();
+                assertNotNull(p);
+
+                ExampleGenerator eg = new ExampleGenerator(p);
+                ArrayList<String> generate = eg.generate(n);
+                assertNotNull(generate);
+                assertEquals(generate.size(), n);
+
+                for (String examples : generate) {
+                        m = pat.matcher(examples);
+                        assertTrue(m.matches()); 
+                }
+            }
+        }
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists