次のテキストを検討してください。
aas( I)f df (as)(dfdsf)(adf).dgdf(sfg).(dfdf) asdfsdf dsfa(asd #54 54 !fa.) sdf
括弧の間のテキストを取得したいのですが、隣接する括弧は 1 つの単位と見なす必要があります。どうやってやるの?
上記の例では、望ましい出力は次のとおりです。
- ( 私)
- (as)(dfdsf)(adf)
- (sfg).(dfdf)
- (asd #54 54 !fa.)
試してみてください[^(](\([^()]+([)](^[[:alnum:]]*)?[(][^()]+)*\))[^)]
。キャプチャ グループ 1 が必要です。
この式は、括弧以外のあらゆる種類の文字が括弧の間のテキストに出現する可能性があり、ネストされた括弧のある部分と一致しないことを前提としています。
私は一緒に行きます:/(?:\(\w+\)(?:\.(?=\())?)+/g
\(\w+\)
a-zA-Z0-9_ リテラル中かっこ内に一致する(?:\.(?=\())?
.
別の左中括弧が続く場合にのみリテラルをキャプチャする(?:)+
隣接するキャプチャを結合するために全体がラップされますvar str = "aas(I)f df (asdfdsf)(adf).dgdf(sfg).(dfdf) asdfsdf dsfa(asdfa) sdf";
str.match(/(?:\(\w+\)(?:\.(?=\())?)+/g);
// -> ["(I)", "(asdfdsf)(adf)", "(sfg).(dfdf)", "(asdfa)"]
()
、エスケープなし()
.
か、互いに隣接させて連結します (柔軟なスペースは許可されません)。(a)(b).(c)
は単一のトークンと見なされます (これ.
はオプションです)。以下の正規表現は、グローバル マッチング (match all) 関数で使用されます。
\([^)]*\)(?:\.?\([^)]*\))*
区切り文字はご自身で付けてください。
正規表現の内訳 (間隔は重要ではありません)。afterと#
include はコメントであり、正規表現の一部ではありません。
\( # Literal (
[^)]* # Match 0 or more characters that are not )
\) # Literal ). These first 3 lines match an instance of wrapped text
(?: # Non-capturing group
\.? # Optional literal .
\([^)]*\) # Match another instance of wrapped text
)* # The whole group is repeated 0 or more times
これはトリックを行う必要があります:
\([A-Za-z0-9]+\)