4 回答

TA貢獻1785條經驗 獲得超8個贊
首先,你不需要逃跑
!
。其次,您替換
\w+
為[^!]+
because\w+
is egal[a-zA-Z0-9_]+
。
所以,你可以試試下面的正則表達式。
!([^!]+)!
您的實現deleteSkid()很好,但是您將值傳遞給 asInputNumber所以defaultValue當組件重新渲染時它不會改變。只需將其替換為value,它就可以工作。
<InputNumber
min={0}
value={skid[key]}
rules={[
{
required: true,
message: "Please input quantity!"
}
]}
onChange={(newQuantity) => {
updateProductQuantity(skid, key, newQuantity, index);
}}
/>const arr = "this! i!s the i!npu!t";
if (arr.includes('!')) {
result = arr.replace(/!([^!]+)!/g, '<b>$1</b>');
}
console.log(result);

TA貢獻1810條經驗 獲得超4個贊
問題是\w不匹配空格,它匹配字母、數字和下劃線。用于[\w\s]匹配字母、數字、下劃線或空格:
const arr = "this! i!s the i!npu!t";
const result = arr.replace(/!([\w\s]+)!/g, '<b>$1</b>');
console.log(result);
您可以安全地刪除arr.includes('!')檢查,因為.replace如果沒有替換發生,命令將返回未更改的字符串。問題是\w不匹配空格,它匹配字母、數字和下劃線。用于[\w\s]匹配字母、數字、下劃線或空格:
const arr = "this! i!s the i!npu!t";
const result = arr.replace(/!([\w\s]+)!/g, '<b>$1</b>');
console.log(result);
您可以安全地刪除arr.includes('!')檢查,因為.replace如果沒有替換發生,命令將返回未更改的字符串。

TA貢獻2003條經驗 獲得超2個贊
它不起作用,因為您使用的是\w, 當您真的想匹配除!. 這樣做的方法是使用[^!].
即, 后跟所有不想[^匹配的字符,再跟.]
更正后的代碼:
const arr = "this! i!s the i!npu!t";
if (arr.includes('!')) {
result = arr.replace(/\!(\w+)\!/g, '<b>$1</b>');
}

TA貢獻1878條經驗 獲得超4個贊
如果這不匹配! !
使空格變為粗體<b> </b>
,并且要<b>
在第一個單詞字符之前開始,! <b>i</b>!
您也可以使用 3 個捕獲組。
如果感嘆號應該配對,您可以使用正向先行來斷言可選對。
(!\s*)(\w+(?:\s+\w+)*)(\s*!)(?=(?:[^!]*![^!]*!)*[^!]*$)
解釋
(!\s*)
奪取第一組,比賽!和可選的空白字符(\w+(?:\s*\w+)*)
捕獲第 2 組,匹配 1+ 個單詞字符并可選擇重復匹配 1+ 個空白字符和 1+ 個單詞字符(\s*!)
捕獲第 3 組,匹配可選的空白字符和 !(?=(?:[^!]*![^!]*!)*[^!]*$)
正面前瞻,斷言可選對!直到字符串的末尾
如果匹配項應在同一行,則可以使用 , 排除否定字符類中的匹配換行符[^!\r\n]
,并用于[^\S\r\n]
匹配沒有換行符的空格而不是\s
const regex = /(!\s*)(\w+(?:\s+\w+)*)(\s*!)(?=(?:[^!]*![^!]*!)*[^!]*$)/g;
[
"this! i!s the i!npu!t",
"! !",
"a!a!bb!c!c",
"a!b!c",
"xyz",
].forEach(s => console.log(s.replace(regex, "$1<b>$2</b>$3")));
添加回答
舉報