사용자 입력 문자열을 정규식으로 변환하는 중
HTML과 JavaScript 정규 표현 테스터를 디자인하고 있습니다.사용자는 regex, 문자열을 입력하고 옵션버튼을 사용하여 테스트할 함수(검색, 일치, 치환 등)를 선택합니다.이 함수가 지정된 인수로 실행되면 프로그램이 결과를 표시합니다.당연히 대체할 추가 인수 등을 위한 추가 텍스트 상자가 있습니다.
문제는 사용자로부터 문자열을 받아 정규 표현으로 바꾸는 것입니다.//
그 에는 깃발을 수 g
★★★★★★★★★★★★★★★★★」i
그래서 그들은 이 모든 것들을//
는 표현식을 중심으로 하고 있습니다만, 그 문자열을 regex로 변환하려면 어떻게 해야 합니까?또, 「RegExp」가 에, 수 .//
사용자 입력 문자열을 regex로 만드는 다른 방법이 있습니까?를 regex로 ?//
른른른 른른 른른 른른 른? 른? ???문자열을 입력하고 플래그를 따로 입력해야 합니까?
문자열에서 정규 표현을 만들려면 RegExp 개체 생성자를 사용합니다.
var re = new RegExp("a|b", "i");
// same as
var re = /a|b/i;
var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
var regex = new RegExp(pattern, flags);
또는
var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$'));
// sanity check here
var regex = new RegExp(match[1], match[2]);
다음은 원라이너입니다.str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
escape-string-regexp NPM 모듈에서 취득했습니다.
테스트 중:
escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
function escapeStringRegExp(str) {
return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
}
console.log(new RegExp(escapeStringRegExp('example.com')));
// => /example\.com/
플래그가 지원되는 태그 부착 템플릿 리터럴 사용:
function str2reg(flags = 'u') {
return (...args) => new RegExp(escapeStringRegExp(evalTemplate(...args))
, flags)
}
function evalTemplate(strings, ...values) {
let i = 0
return strings.reduce((str, string) => `${str}${string}${
i < values.length ? values[i++] : ''}`, '')
}
console.log(str2reg()`example.com`)
// => /example\.com/u
JavaScript RegExp 개체 생성자를 사용합니다.
var re = new RegExp("\\w+");
re.test("hello");
플래그를 두 번째 문자열 인수로 컨스트럭터에 전달할 수 있습니다.상세한 것에 대하여는, 메뉴얼을 참조해 주세요.
나의 경우, 유저 입력이 딜리미터로 둘러싸인 경우도 있고, 그렇지 않은 경우도 있기 때문에, 다른 케이스를 추가했습니다.
var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/);
if (regParts) {
// the parsed pattern had delimiters and modifiers. handle them.
var regexp = new RegExp(regParts[1], regParts[2]);
} else {
// we got pattern string without delimiters
var regexp = new RegExp(inputstring);
}
다음 기능을 사용해 보십시오.
const stringToRegex = str => {
// Main regex
const main = str.match(/\/(.+)\/.*/)[1]
// Regex options
const options = str.match(/\/.+\/(.*)/)[1]
// Compiled regex
return new RegExp(main, options)
}
다음과 같이 사용할 수 있습니다.
"abc".match(stringToRegex("/a/g"))
//=> ["a"]
사용자 지정 구분 기호 및 잘못된 플래그를 처리하는 단일 라이너 함수입니다.
// One liner
var stringToRegex = (s, m) => (m = s.match(/^([\/~@;%#'])(.*?)\1([gimsuy]*)$/)) ? new RegExp(m[2], m[3].split('').filter((i, p, s) => s.indexOf(i) === p).join('')) : new RegExp(s);
// Readable version
function stringToRegex(str) {
const match = str.match(/^([\/~@;%#'])(.*?)\1([gimsuy]*)$/);
return match ?
new RegExp(
match[2],
match[3]
// Filter redundant flags, to avoid exceptions
.split('')
.filter((char, pos, flagArr) => flagArr.indexOf(char) === pos)
.join('')
)
: new RegExp(str);
}
console.log(stringToRegex('/(foo)?\/bar/i'));
console.log(stringToRegex('#(foo)?\/bar##gi')); //Custom delimiters
console.log(stringToRegex('#(foo)?\/bar##gig')); //Duplicate flags are filtered out
console.log(stringToRegex('/(foo)?\/bar')); // Treated as string
console.log(stringToRegex('gig')); // Treated as string
별도의 체크 박스나 특수 플래그를 위한 텍스트 필드도 추가할 것을 권장합니다.는 더 하지 않아도 됩니다.//
s. 치환의 경우 2개의 텍스트필드를 입력합니다.이렇게 하면 생활이 훨씬 편해질 거예요.
일부 가 '만들기'를 추가할 수 에? 그렇지 않으면 일부 사용자가//
하다 보면 구문 날 요.을 사용하다그리고 나서, 당신이 옷을 벗기고 나서//
의 경우 사용자가 의도한 것과 전혀 다른 구문적으로 유효한 regex가 생성되어 (사용자의 관점에서) 이상한 동작이 발생할 수 있습니다.
문자열이 비활성화되거나 플래그가 포함되어 있지 않은 경우에도 이 조작은 유효합니다.
function regExpFromString(q) {
let flags = q.replace(/.*\/([gimuy]*)$/, '$1');
if (flags === q) flags = '';
let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q);
try { return new RegExp(pattern, flags); } catch (e) { return null; }
}
console.log(regExpFromString('\\bword\\b'));
console.log(regExpFromString('\/\\bword\\b\/gi'));
이전 답변 덕분에 이 블록은 구성 가능한 문자열을 RegEx에 적용하기 위한 범용 솔루션 역할을 합니다.텍스트 필터링:
var permittedChars = '^a-z0-9 _,.?!@+<>';
permittedChars = '[' + permittedChars + ']';
var flags = 'gi';
var strFilterRegEx = new RegExp(permittedChars, flags);
log.debug ('strFilterRegEx: ' + strFilterRegEx);
strVal = strVal.replace(strFilterRegEx, '');
// this replaces hard code solt:
// strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
체크박스를 사용하여 플래그를 요청하고 다음과 같은 작업을 수행할 수 있습니다.
var userInput = formInput;
var flags = '';
if(formGlobalCheckboxChecked) flags += 'g';
if(formCaseICheckboxChecked) flags += 'i';
var reg = new RegExp(userInput, flags);
더 안전하지만 안전하지 않습니다. (다른 컨텍스트에 액세스할 수 없는 버전의 기능이 좋습니다.)
const regexp = Function('return ' + string)()
사용하고 있다eval
이 문제를 해결합니다.
예를 들어 다음과 같습니다.
function regex_exec() {
// Important! Like @Samuel Faure mentioned, Eval on user input is a crazy security risk, so before use this method, please take care of the security risk.
var regex = $("#regex").val();
// eval()
var patt = eval(userInput);
$("#result").val(patt.exec($("#textContent").val()));
}
언급URL : https://stackoverflow.com/questions/874709/converting-user-input-string-to-regular-expression
'programing' 카테고리의 다른 글
특정 문자 뒤에 문자열 부분 제거 (0) | 2022.10.14 |
---|---|
Java에서의 Ctrl+C 캡처 (0) | 2022.10.14 |
레일 표에서 어떤 인덱스를 추가할 때 (0) | 2022.10.14 |
임의 조건 함수에 따라 사전을 필터링하려면 어떻게 해야 합니까? (0) | 2022.10.14 |
Python에서 공백에 문자열 분할 (0) | 2022.10.14 |