RegEx для сопоставления запятых внутри значений массива - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь проанализировать файл CSV строка за строкой

String rowStr = br.readLine(); 

Когда я попытался распечатать rowStr, я вижу ниже

"D","123123","JAMMY,"," ","PILOT"

Как я могу удалить запятую изполе значения?Я хочу сохранить запятые снаружи.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Это выражение может помочь вам сделать это, однако, возможно, нет необходимости выполнять эту задачу с регулярными выражениями. Если вы еще хотите / должны сделать это:

(")([A-z0-9\s]+)([,]?)(",)?

Я добавил границы, просто чтобы быть в безопасности. Вы можете значительно упростить это. Ключ должен добавить группу захвата до и одно после значений.

enter image description here

Например, одна из границ заключается в том, что в случае, если у вас случайно появятся лишние запятые, которые не являются значениями, он не будет фиксировать это

enter image description here

Graph

Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения в этой ссылке :

enter image description here

Java Test

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(\")([A-z0-9\\s]+)([,]?)(\",)?";
final String string = "\"D\",\"123123\",\"JAMMY,\",\" \",\"PILOT\"";
final String subst = "\\1\\2 \\4";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);

JavaScript Test Demo

const regex = /(")([A-z0-9\s]+)([,]?)(",)?/gm;
const str = `"D","123123","JAMMY,"," ","PILOT"`;
const subst = `$1$2 $4`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Тест производительности

repeat = 1000000;
start = Date.now();

for (var i = repeat; i >= 0; i--) {
	var string = '"D","123123","JAMMY,"," ","PILOT"';
	var regex = /(")([A-z0-9\s]+)([,]?)(",)?/gm;
	var match = string.replace(regex, "$1$2$4");
}

end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
1 голос
/ 08 мая 2019

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

(?<!"),|,(?!")

Соответствует запятой, которой не предшествует или , за которой не следует ".
Тест здесь .

...