Skip to content

Commit

Permalink
string interchangeble with verbalexp
Browse files Browse the repository at this point in the history
  • Loading branch information
pathikrit committed Jun 4, 2014
1 parent fc8eba6 commit 379d921
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 37 deletions.
34 changes: 21 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,30 @@ ScalaVerbalExpressions

```scala
import com.github.verbalexpressions.VerbalExpression

val urlTester = VerbalExpression()
.startOfLine()
.andThen("http")
.maybe("s")
.then("://")
.maybe("www.")
.anythingBut(" ")
.endOfLine()
import VerbalExpression._

val fraction = $.andThen(".").digits()
val number = $.maybe("-").digits().maybe(fraction)

assert("3" is number)
assert("-4" is number)
assert("-4.58" is number, number.regexp)
assert("0." isNot number)
assert("hello" isNot number)
assert("4.3.2" isNot number)

val urlTester = $.startOfLine()
.andThen("http")
.maybe("s")
.andThen("://")
.maybe("www.")
.anythingBut(" ")
.endOfLine()

val someUrl = "https://www.google.com"

val result = if (urlTester test someUrl) "Valid" else "Invalid"

println(s"$someUrl is $result")
```
assert(urlTester test someUrl)
```

For more methods, checkout the [wiki](https://github.com/VerbalExpressions/JSVerbalExpressions/wiki) and the [source](src/main/scala/com/github/verbalexpressions/VerbalExpression.scala)

Expand Down
3 changes: 2 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ scalaVersion := "2.11.1"
crossScalaVersions := Seq("2.10.4", "2.11.1")

scalacOptions ++= Seq(
"-unchecked", "-deprecation", "-feature"
"-unchecked", "-deprecation", "-feature",
"-language:postfixOps,implicitConversions,experimental.macros,dynamics,existentials,higherKinds"
)

libraryDependencies ++= Seq(
Expand Down
33 changes: 21 additions & 12 deletions src/main/scala/com/github/verbalexpressions/VerbalExpression.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,38 @@ import java.util.regex.Pattern
import com.github.verbalexpressions.VerbalExpression._

case class VerbalExpression(prefix: String = "", expression: String = "", suffix: String = "", modifiers: Int = 0) {
import java.util.regex.Pattern.quote

def replace(source: String, value: String) = source.replaceAll(toString, value)

def add(value: String) = copy(expression = expression + value)

def andThen(value: String) = add(s"(${quote(value)})")
def then = andThen _
def andThen(value: StringOrVerbalExp) = add(s"($value)")
def `then` = andThen _
def find = andThen _

def maybe(value: String) = add(s"(${quote(value)})?")
def maybe(value: StringOrVerbalExp) = add(s"($value)?")

def multiple(value: String) = add(s"${quote(value)}+")
def multiple(value: StringOrVerbalExp) = add(s"($value)+")
def many = multiple _

def anything = add("(.*)")
def anythingBut(value: String) = add(s"([^${quote(value)}]*)")
def anythingBut(value: StringOrVerbalExp) = add(s"([^$value]*)")

def something = add("(.+)")
def somethingBut(value: String) = add(s"([^${quote(value)}]+)")
def somethingBut(value: StringOrVerbalExp) = add(s"([^$value]+)")

def whitespace(enable: Boolean = true) = add(if (enable) "\\s+" else "\\S+")
def word(enable: Boolean = true) = add(if (enable) "\\w+" else "\\W+")
def digits(enable: Boolean = true) = add(if (enable) "\\d+" else "\\D+")

def anyOf(value: String) = add(s"[${quote(value)}]")
def anyOf(value: StringOrVerbalExp) = add(s"[$value]")
def any = anyOf _

def lineBreak = add("(\\n|(\\r\\n))")
def startOfLine(enable: Boolean = true) = copy(prefix = if (enable) "^" else "")
def endOfLine(enable: Boolean = true) = copy(suffix = if (enable) "$" else "")

def or(value: String) = copy("(" + prefix, expression + ")|(" + value, ")" + suffix)
def or(value: VerbalExpression): VerbalExpression = or(value.expression)
def or(value: StringOrVerbalExp) = copy("(" + prefix, expression + ")|(" + value, ")" + suffix)

def range(args: (Any, Any)*) = add(s"[${(args map {case (a, b) => s"$a-$b"}).mkString}]")

Expand All @@ -63,13 +61,16 @@ case class VerbalExpression(prefix: String = "", expression: String = "", suffix
def regexp = compile.pattern()

def test = Pattern.matches(toString, _: String)
def check = test _
def matches = test _
def check = test

override def toString = regexp
}

object VerbalExpression {
sealed trait StringOrVerbalExp
implicit def lift(s: String): StringOrVerbalExp = new StringOrVerbalExp {override def toString = Pattern.quote(s)}
implicit def lift(v: VerbalExpression): StringOrVerbalExp = new StringOrVerbalExp {override def toString = v.regexp}

sealed abstract class Modifier(val mask: Int)
object UnixLines extends Modifier(Pattern.UNIX_LINES)
object CaseInsensitive extends Modifier(Pattern.CASE_INSENSITIVE)
Expand All @@ -78,4 +79,12 @@ object VerbalExpression {
object Dotall extends Modifier(Pattern.DOTALL)
object UnixCase extends Modifier(Pattern.UNICODE_CASE)
//object UnicodeCharacterClass extends(Pattern.UNICODE_CHARACTER_CLASS)

implicit class StringMatchUtils(s: String) {
def is(expr: VerbalExpression) = expr check s
def matches = is _
def isNot(expr: VerbalExpression) = !is(expr)
}

val $ = VerbalExpression()
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ class VerbalExpressionSpec extends Specification {
VerbalExpression()
.add("aa")
.or("bb")
.toString mustEqual "(aa)|(bb)"
.toString mustEqual "(aa)|(\\Qbb\\E)"
}
}

Expand Down Expand Up @@ -224,20 +224,34 @@ class VerbalExpressionSpec extends Specification {
}
}

"README example" should {
"README examples" should {
"work" in {
val urlTester = VerbalExpression()
.startOfLine()
.andThen("http")
.maybe("s")
.then("://")
.maybe("www.")
.anythingBut(" ")
.endOfLine()
import com.github.verbalexpressions.VerbalExpression
import VerbalExpression._

val fraction = $.andThen(".").digits()
val number = $.maybe("-").digits().maybe(fraction)

assert("3" is number)
assert("-4" is number)
assert("-4.58" is number, number.regexp)
assert("0." isNot number)
assert("hello" isNot number)
assert("4.3.2" isNot number)

val urlTester = $.startOfLine()
.andThen("http")
.maybe("s")
.andThen("://")
.maybe("www.")
.anythingBut(" ")
.endOfLine()

val someUrl = "https://www.google.com"

urlTester.test(someUrl) must beTrue
assert(urlTester test someUrl)

ok
}
}
}

0 comments on commit 379d921

Please sign in to comment.