2015-11-07 4 views
2

Вот код:Соответствие шаблону Regex не работает в scala.js?

val s = 
    """ 
    |\begin{bmatrix} 
    |\cos \theta & -\sin \theta \\ 
    |\sin \theta & \cos \alpha 
    |\end{bmatrix} 
    """.stripMargin 

val lastWordPattern = """(?s)(.*)\s+(.*)""".r 
def wordToPos(string: String, position: Int): String = { 
    val subString = string.substring(0, position) 
    println("sub: ", subString) 
    subString match { 
    case lastWordPattern([email protected]_*) => { 
     println(0, x(0)) 
     println(1, x(1)) 
     x(0) 
    } 
    case _ => "" 
    } 
} 
wordToPos(s, 20) 

Результат от sbt console:

scala>  wordToPos(s, 20) 
(sub: , 
\begin{bmatrix} 
\co) 
(0, 
\begin{bmatrix}) 
(1,\co) 

Результат от хрома:

(sub: , 
\begin{bmatrix} 
\co) 

В хроме код печатает подстроку, но не совпадает с регулярным выражением , Я что-то не так?

+2

Я думаю, что это потому, что JS не поддерживает '(? S)' модификатор. Попробуйте заменить все '.' на' [\ s \ S] 'и повторить попытку. –

+0

Действительно, это решает проблему. – qed

ответ

2

В JavaScript не поддерживает SingleLine модификатора (ни инлайн, ни регулярные один), вам нужно заменить все . вне символьного класса с [\s\S] (классом символов с противоположными сокращёнными классами, который соответствует любому символу может быть в строке).

С [\s\S] вы будете соответствовать любому символу, включая новую строку, без указания режима одиночной линии.

val lastWordPattern = """([\s\S]*)\s+([\s\S]*)""".r 
Смежные вопросы