Выберите первый символ перед прямым sh, но после любого пробела - PullRequest
0 голосов
/ 16 января 2020

У меня есть следующие строковые шаблоны, которые мне нужно сопоставить, как описано.

Мне нужен только первый символ / ди git в каждом из следующих примеров. До '/' и после любого пробела:

12/5 <--match on 1
x23/4.5 match on x
234.5/7 match on 2
2 - 012.3/4 match on 0

regex явно недостаточно следующего:

\d(?=\d\/))

Чтобы сделать Clear I'm на самом деле, используя регулярное выражение с js split, так что это некоторая функция mpping, которая берет каждую из строк и разделяет ее в совпадении. Так, например, 2 - 012.3/4 будет разделен на [ 2 - 0, 12.3/4] и 12/5 to 1, [2/5] и т. Д.

См. Пример (с нерабочим регулярным выражением) здесь:

https://regex101.com/r/N1RbGp/1

Ответы [ 3 ]

1 голос
/ 16 января 2020

Попробуйте регулярное выражение, подобное этому:

(?<=^|\s)[a-zA-Z0-9](?=[^\s]*[/])

Разбить его:

  • (?<=^|\s) - это положительный вид сзади нулевой ширины (без захвата) это гарантирует, что совпадение начнется только сразу после начала текста или пробела.

  • [a-zA-Z0-9] соответствует одной букве или di git.

  • (?=\S*[/]) - это положительный прогноз нулевой ширины (без захвата), который требует, чтобы за совпадающей буквой или ди git следовали ноль или более непробельных символов и solidus ('/') символ.

Вот код:

const texts = [
  '12/5',
  'x23/4.5',
  '234.5/7',
  '2 - 012.3/4',
];
texts.push( texts.join(', ') );

for (const text of texts) {
  const rx = /(?<=^|\s)[a-zA-Z0-9](?=\S*[/])/g;

  console.log('');
  console.group(`text: '${text}'`);
  for(let m = rx.exec(text) ; m ; m = rx.exec(text) ) {
    console.log(`matched '${m[0]}' at offset ${m.index} in text.`);
  }
  console.groupEnd();

}

Это вывод:

text: '12/5'
  matched '1' at offset 0 in text.

text: 'x23/4.5'
  matched 'x' at offset 0 in text.

text: '234.5/7'
  matched '2' at offset 0 in text.

text: '2 - 012.3/4'
  matched '0' at offset 4 in text.

text: '12/5, x23/4.5, 234.5/7, 2 - 012.3/4'
  matched '1' at offset 0 in text.
  matched 'x' at offset 6 in text.
  matched '2' at offset 15 in text.
  matched '0' at offset 28 in text.
0 голосов
/ 16 января 2020

Первая группа в этом регулярном выражении соответствует символу, который вы запрашиваете:

([^\s])[^\s]*/

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

[^\s]+/

И использовать первый символ соответствия (или, может быть, вам все равно нужен отдых).

0 голосов
/ 16 января 2020

Если вы хотите иметь возможность сканировать весь документ:

/(?<=(^|\s))\S(?=\S*\/)/g

https://regex101.com/r/rN08sP/1

s = `12/5
x23/4.5
234.5/2
534/5.6
- 49.55/6.5
234.5/7`;

console.log(s.match(/(?<=(^|\s))\S(?=\S*\/)/g));

Но если вы хотите извлечь этот символ из короткой строки: (вы имели в виду пробел впереди?)

Это будет /\s(\S)\S*\//

const arr = [
  " 12/5",
  " x23/4.5",
  " 234.5/7",
  " 2 - 012.3/4"
];

arr.forEach(s => {
  let result = s.match(/\s(\S)\S*\//);
  if (result)
    console.log("For", s, "result: ", result[1])
});

Но если "начало строки" в порядке ... значит, впереди не нужно места, тогда /(^|\s)(\S)\S*\//:

const arr = [
  "12/5",
  "x23/4.5",
  "234.5/7",
  "2 - 012.3/4"
];

arr.forEach(s => {
  let result = s.match(/(^|\s)(\S)\S*\//);
  if (result)
    console.log("For", s, "result: ", result[2])
});

Но на самом деле, если вы не имеете в виду буквально пространство, а просто границу в целом:

const arr = [
  "12/5",
  "x23/4.5",
  "234.5/7",
  "2 - 012.3/4"
];

arr.forEach(s => {
  let result = s.match(/\b(\S)\S*\//);
  if (result)
    console.log("For", s, "result: ", result[1])
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...