Skip to content

Commit ab001c2

Browse files
committed
Merge pull request #22 from lanwen/builder
add - factory methods for builder (with method to clone)
2 parents c9e70b4 + df2e529 commit ab001c2

File tree

4 files changed

+63
-16
lines changed

4 files changed

+63
-16
lines changed

README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ You can use *SNAPSHOT* dependency with adding to `pom.xml`:
3131

3232
##Examples
3333
```java
34-
VerbalExpression testRegex = new VerbalExpression.Builder()
34+
VerbalExpression testRegex = VerbalExpression.regex()
3535
.startOfLine()
3636
.then("http")
3737
.maybe("s")
@@ -44,14 +44,13 @@ VerbalExpression testRegex = new VerbalExpression.Builder()
4444
// Create an example URL
4545
String url = "https://www.google.com";
4646

47-
// Use VerbalExpression's testExact() method to test if the entire string matches
48-
// the regex
47+
// Use VerbalExpression's testExact() method to test if the entire string matches the regex
4948
testRegex.testExact(url); //True
5049

5150
testRegex.toString(); // Outputs the regex used:
5251
// ^(http)(s)?(\:\/\/)(www\.)?([^\ ]*)$
5352

54-
VerbalExpression testRegex = new VerbalExpression.Builder()
53+
VerbalExpression testRegex = VerbalExpression.regex()
5554
.startOfLine()
5655
.then("abc")
5756
.or("def")
@@ -64,6 +63,12 @@ testRegex.test(testString); //true
6463
testRegex.testExact(testString); //false
6564
```
6665

66+
Builder can be cloned:
67+
```java
68+
// Produce: (.*)$
69+
VerbalExpression regex = regex(regex().anything().addModifier('i')).endOfLine().build();
70+
```
71+
6772
## Other implementations
6873
You can view all implementations on [VerbalExpressions.github.io](http://VerbalExpressions.github.io)
6974
- [Javascript](https://github.com/VerbalExpressions/JSVerbalExpressions)

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

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,23 @@ public static class Builder {
1212
private StringBuilder prefixes = new StringBuilder();
1313
private StringBuilder source = new StringBuilder();
1414
private StringBuilder suffixes = new StringBuilder();
15-
private Pattern pattern;
1615
private int modifiers = Pattern.MULTILINE;
1716

1817
private String sanitize(final String pValue) {
1918
return pValue.replaceAll("[\\W]", "\\\\$0");
2019
}
2120

21+
public VerbalExpression build() {
22+
Pattern pattern = Pattern.compile(new StringBuilder(prefixes)
23+
.append(source).append(suffixes).toString(), modifiers);
24+
return new VerbalExpression(pattern);
25+
}
26+
2227
public Builder add(String pValue) {
2328
this.source.append(pValue);
2429
return this;
2530
}
2631

27-
public VerbalExpression build() {
28-
pattern = Pattern.compile(new StringBuilder(prefixes)
29-
.append(source).append(suffixes).toString(), modifiers);
30-
return new VerbalExpression(this);
31-
}
32-
3332
public Builder startOfLine(boolean pEnable) {
3433
this.prefixes.append(pEnable ? "^" : "");
3534
return this;
@@ -254,8 +253,8 @@ public boolean test(final String pToTest) {
254253
return ret;
255254
}
256255

257-
private VerbalExpression(final Builder pBuilder) {
258-
pattern = pBuilder.pattern;
256+
private VerbalExpression(final Pattern pattern) {
257+
this.pattern = pattern;
259258
}
260259

261260
public String getText(String toTest) {
@@ -265,7 +264,22 @@ public String getText(String toTest) {
265264
result.append(m.group());
266265
}
267266
return result.toString();
268-
}
267+
}
268+
269+
public static Builder regex(final Builder pBuilder) {
270+
Builder builder = new Builder();
271+
272+
builder.prefixes = new StringBuilder(pBuilder.prefixes);
273+
builder.source = new StringBuilder(pBuilder.source);
274+
builder.suffixes = new StringBuilder(pBuilder.suffixes);
275+
builder.modifiers = pBuilder.modifiers;
276+
277+
return builder;
278+
}
279+
280+
public static Builder regex() {
281+
return new Builder();
282+
}
269283

270284
@Override
271285
public String toString() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public void testWithAnyCase() {
177177

178178
@Test
179179
public void testSearchOneLine() {
180-
VerbalExpression testRegex = new VerbalExpression.Builder()
180+
VerbalExpression testRegex = VerbalExpression.regex()
181181
.startOfLine()
182182
.then("a")
183183
.br()

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import org.junit.Test;
44

5+
56
import static org.hamcrest.CoreMatchers.equalTo;
6-
import static org.junit.Assert.assertEquals;
7+
import static org.hamcrest.core.IsNot.not;
78
import static org.junit.Assert.assertThat;
89
import static org.junit.Assert.assertTrue;
910

@@ -30,4 +31,31 @@ public void testUrl() {
3031
testRegex.toString(),
3132
equalTo("^(http)(s)?(\\:\\/\\/)(www\\.)?([^\\ ]*)$"));
3233
}
34+
35+
@Test
36+
public void staticFabricsRetunSameAsConstructorExpressions() {
37+
VerbalExpression regexViaFactory = VerbalExpression.regex().anything().build();
38+
VerbalExpression regexViaConstructor = new VerbalExpression.Builder().anything().build();
39+
40+
assertThat("Factory builder method produce not same as constructor regex",
41+
regexViaFactory.toString(), equalTo(regexViaConstructor.toString()));
42+
}
43+
44+
@Test
45+
public void clonedBuilderEqualsOriginal() {
46+
VerbalExpression.Builder builder = VerbalExpression.regex().anything().addModifier('i');
47+
VerbalExpression.Builder clonedBuilder = VerbalExpression.regex(builder);
48+
49+
assertThat("Cloned builder changed after creating new one",
50+
builder.build().toString(), equalTo(clonedBuilder.build().toString()));
51+
}
52+
53+
@Test
54+
public void clonedBuilderCantChangeOriginal() {
55+
VerbalExpression.Builder builder = VerbalExpression.regex().anything().addModifier('i');
56+
VerbalExpression.Builder clonedBuilder = VerbalExpression.regex(builder).endOfLine();
57+
58+
assertThat("Cloned builder changed after creating new one",
59+
builder.build().toString(), not(clonedBuilder.build().toString()));
60+
}
3361
}

0 commit comments

Comments
 (0)