Skip to content

Commit a669493

Browse files
simschlalanwen
andauthored
Fixing the handling of (unmatched) optional capture groups (#75)
* adding test showing the problematic handling of optional capture groups * do not return "null"-String when an optional capture group is actually not matched * upgrading travis jdk version since it no longer supports jdk's older than 9: > $ ~/bin/install-jdk.sh --target "/home/travis/oraclejdk8" --workspace "/home/travis/.cache/install-jdk" --feature "8" --license "BCL" > Ignoring license option: BCL -- using GPLv2+CE by default > install-jdk.sh 2020-06-02 > Expected feature release number in range of 9 to 16, but got: 8 * we no longer return the "null" string literal * reduce assertions Co-authored-by: Kirill Merkushev <[email protected]> * Update .travis.yml Co-authored-by: Kirill Merkushev <[email protected]>
1 parent 44af1c7 commit a669493

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ language: java
22
sudo: false
33

44
jdk:
5-
- oraclejdk8
5+
- openjdk8
66

77
install:
88
- mvn --settings .travis/settings.xml install -DskipTests=true -Dgpg.skip -Dmaven.javadoc.skip=true -B -V

src/main/java/ru/lanwen/verbalregex/VerbalExpression.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,10 @@ public String getText(final String toTest, final int group) {
762762
Matcher m = pattern.matcher(toTest);
763763
StringBuilder result = new StringBuilder();
764764
while (m.find()) {
765-
result.append(m.group(group));
765+
String groupValue = m.group(group);
766+
if (groupValue != null) {
767+
result.append(groupValue);
768+
}
766769
}
767770
return result.toString();
768771
}
@@ -781,7 +784,10 @@ public String getText(final String toTest, final String group) {
781784
Matcher m = pattern.matcher(toTest);
782785
StringBuilder result = new StringBuilder();
783786
while (m.find()) {
784-
result.append(m.group(group));
787+
String groupValue = m.group(group);
788+
if (groupValue != null) {
789+
result.append(groupValue);
790+
}
785791
}
786792
return result.toString();
787793
}

src/test/java/ru/lanwen/verbalregex/BasicFunctionalityUnitTest.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,9 @@ public void testOrWithCapture() {
497497
assertThat("Starts with abc or def", testRegex, matchesTo("abczzz"));
498498
assertThat("Doesn't start with abc or def", testRegex, not(matchesExactly("xyzabcefg")));
499499

500-
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abcnull"));
501-
assertThat(testRegex.getText("xxxdefzzz", 1), equalTo("null"));
502-
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abcnull"));
500+
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abc"));
501+
assertThat(testRegex.getText("xxxdefzzz", 1), equalTo(""));
502+
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abc"));
503503
}
504504

505505
@Test
@@ -516,11 +516,11 @@ public void testOrWithNamedCapture() {
516516
testRegex, not(matchesExactly("xyzabcefg")));
517517

518518
assertThat(testRegex.getText("xxxabcdefzzz", captureName),
519-
equalTo("abcnull"));
519+
equalTo("abc"));
520520
assertThat(testRegex.getText("xxxdefzzz", captureName),
521-
equalTo("null"));
521+
equalTo(""));
522522
assertThat(testRegex.getText("xxxabcdefzzz", captureName),
523-
equalTo("abcnull"));
523+
equalTo("abc"));
524524
}
525525

526526
@Test
@@ -535,9 +535,9 @@ public void testOrWithClosedCapture() {
535535
assertThat("Starts with abc or def", testRegex, matchesTo("abczzz"));
536536
assertThat("Doesn't start with abc or def", testRegex, not(matchesExactly("xyzabcefg")));
537537

538-
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abcnull"));
539-
assertThat(testRegex.getText("xxxdefzzz", 1), equalTo("null"));
540-
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abcnull"));
538+
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abc"));
539+
assertThat(testRegex.getText("xxxdefzzz", 1), equalTo(""));
540+
assertThat(testRegex.getText("xxxabcdefzzz", 1), equalTo("abc"));
541541
}
542542

543543
@Test
@@ -555,11 +555,11 @@ public void testOrWithClosedNamedCapture() {
555555
testRegex, not(matchesExactly("xyzabcefg")));
556556

557557
assertThat(testRegex.getText("xxxabcdefzzz", captureName),
558-
equalTo("abcnull"));
558+
equalTo("abc"));
559559
assertThat(testRegex.getText("xxxdefzzz", captureName),
560-
equalTo("null"));
560+
equalTo(""));
561561
assertThat(testRegex.getText("xxxabcdefzzz", captureName),
562-
equalTo("abcnull"));
562+
equalTo("abc"));
563563
}
564564

565565
@Test

src/test/java/ru/lanwen/verbalregex/RealWorldUnitTest.java

+17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.junit.Test;
55

66
import static org.hamcrest.CoreMatchers.equalTo;
7+
import static org.hamcrest.CoreMatchers.not;
78
import static org.junit.Assert.assertEquals;
89
import static org.junit.Assert.assertThat;
910
import static ru.lanwen.verbalregex.VerbalExpression.regex;
@@ -149,4 +150,20 @@ public void captureAfterNewLineHasANamedGroup() {
149150
assertThat(some,
150151
equalTo(expression.getText(lineBreak + some + text, captureName)));
151152
}
153+
154+
@Test
155+
public void missingOptionalCaptureGroupReturnsEmptyStringNotStringContainingNullLiteral() {
156+
final VerbalExpression expression = VerbalExpression.regex().
157+
startOfLine()
158+
.capture("optionalCapture")
159+
.oneOf("a", "b")
160+
.endCapture()
161+
.count(0, 1)
162+
.then("c")
163+
.endOfLine()
164+
.build();
165+
final String testString = "c";
166+
assertThat(expression, matchesExactly(testString));
167+
assertThat(expression.getText("c", "optionalCapture"), equalTo(""));
168+
}
152169
}

0 commit comments

Comments
 (0)