2016-01-24 4 views
0

Я объясняю свой вопрос через 2 примера:Как определить, является ли строка кодовым методом?

example1:

var str1 = "this is a test 
       this is a test"; 

Я хочу это: this is not code-method

Example2:

var str2 = " this is a test 

       this is a tes"; 

Я хочу это: this is code-method


Итак, как вы видите, в приведенных выше примерах, если все строки начинаются с по крайней мере 4 пробелов (в начале) то code-method, иначе это not code-method. Как я могу это сделать?


Все, что можно сделать, это подсчет количества строк:

var text = str.val(); 
var lines = text.split(/\r|\r\n|\n/); 
var count = lines.length; 
alert(count); // it is the number of lines in the string 

Также this regex выбирает все пространство перед символом новой строки. (я не знаю, что это полезно или нет)

/\n?\s+/gm 
+1

Обновлено [regex] (https://regex101.com/r/lM4pV7/3). Теперь он должен работать. –

ответ

1

Регулярное выражение /\n?\s+/gm подберет линий, которые имеют один или несколько пробелов в начале. Вам нужно проверить, начинается ли линия с четырех пробелов.

Вы можете использовать

/^ {4}/gm 

RegEx Explanation

  1. ^: Начало линии
  2. {4}: Матч четырех пространств
  3. gm: Глобальные и многострочный флаг

// RegEx 
 
var linebreak = /\r\n|\r|\n/g, 
 
    coded = /^ {4}/gm; 
 

 
function isCoded(str) { 
 
    return str.split(linebreak).length === (str.match(coded) || []).length; 
 
} 
 

 
var str1 = ` this is a test 
 
       this is a tes`, 
 
    str2 = ` this is test 
 
    not coded`; 
 

 
document.body.innerHTML = str1 + ': is-coded? ' + isCoded(str1) + '<br />' + str2 + ': is-coded? ' + isCoded(str2);

+0

Ну, спасибо, ваше регулярное выражение может быть ключом! На самом деле мне нужно определить, что строка является «code-method» или нет ..! – stack

+0

На самом деле он должен проверить, есть ли более 4 пробелов, поэтому используйте '{4,}'. –

+0

@noob Пожалуйста, проверьте демоверсию, она проверяет это. '{4}' будет соответствовать четырем пробелам, поэтому он возвращает true, когда строка содержит более 4 пробелов в начале строки. – Tushar

1

Что-то вроде

> str1.split(/\r|\r\n|\n/).length == str1.match(/^\s{4,}/gm).length 
< false 

и

> str2.split(/\r|\r\n|\n/).length == str2.match(/^\s{4,}/gm).length 
< true 
+0

emm, кажется хорошо, спасибо .. lemme проверить это .. – stack

+0

Я пропустил '.length'. теперь исправлено – nu11p01n73R

1

Вам нужно возвращать логическое значение, если вы хотите работать, является ли или не строка ,

Вы можете разделить строку на строки новой строки, а затем использовать метод every с функцией предиката, чтобы проверить, соответствует ли каждая строка вашим критериям.

function isCodeMethod(string) { 
    const hasIndent = /^\s{4}/; 
    return string 
    .split("\n") 
    .every(s => hasIndent.test(s)); 
} 

С некоторыми пробными вводами.

// false 
isCodeMethod("this is a test") 

// true 
isCodeMethod(" this is a test") 

// false 
isCodeMethod(` this is a test1 
this is a test2`) 

// true 
isCodeMethod(` this is a test1 
this is a test2`) 

// true 
isCodeMethod(` this is a test1 
        this is a test2`) 
+0

В вашем коде есть эта ошибка: * Uncaught SyntaxError: Неожиданный токен => *. Можете ли вы это исправить? – stack

+0

Вы можете использовать браузер, который поддерживает функции стрелок ES2015, или посмотреть [как перевести этот код обратно в ES5] (http://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&code=function % 20isCodeMethod (строка)% 20% 7B% 0A% 20% 20const% 20hasIndent% 20% 3D% 20% 2F% 5E% 5cs% 7B4% 7D% 2F% 3B% 0A% 20% 20return% 20string% 0A% 20% 20% 20% 20.split (% 22% 5Cn% 22)% 0A% 20% 20% 20% 20.every (ы% 20% 3D% 3E% 20hasIndent.test (ов))% 3B% 0A% 7D) , –

Смежные вопросы