เงื่อนไขการค้นหาให้ตรงกับจำนวนเต็มจริง

0

คำถาม

ฉันกำลังคิดเรื่องกำลังวิเคราะห์การรายชื่อของ integers(จากทรัพย์สินข้อความ). อย่างไรก็ตามฉันอยากจะไปเหนือไปแค่ระหว่างค่าที่เป็นบวกและลทศนิยมค่าและการวิเคราะห์ มี ข้อความนั่นบ่งชี้ว่า เป็นจำนวนเต็มของจาวายึดตามตัวอักษรแบบนั้(JLS 17) ที่ได้เจอในรหัสต้นทางของ. เหมือนๆกันฉันอยากจะเป็นที่อ่อนเกินไปด้วยฝากฝังที่ไหน prefixes,ตัวแบ่งเหมาะกัและ appendices รอบๆ integers องตัวเอง หรือจะพูดอีกอย่าง,ฉันอยากจะเจอพวกเขาใช้โทรศัพท์อีก Matcher.find().

มีเงื่อนไขการค้นหาที่ตรงกับทั้งหมดเท่าที่ทำได้ของจาวาจำนวนเต็ม literals? มันไม่จำเป็นที่จะต้องตรวจห้องด้านบนและด้านล่างขอบเขต.


ถึงแม้ว่าฉันทำในข้อบังคับของเชื่อมโยงไปยังที่ JLS ฉันจะแสดงบางอย่าถูกต้องและไม่ถูกต้องตัวเลข:

  • -1ที่ 1 คือตรงกันแต่ทางลบเป็น unary โอเปอเรเตอร์(ผมจะปรับตัวถ้าจำเป็นต้องใช้)
  • 0x00_00_00_0F:ค่าสิบห้าคือตรงกับเป็นเลขฐานสิบหอกเลขรหัสด้วย underscore ต้องแยกกันสองคน nibbles
  • 0b0000_1111:ค่าสิบห้าในเลขฐานสองคือตรงกับ
  • 017ที่ octal ค่าสิบห้าของคืนตรงกันกับ
integer java literals regex
2021-11-23 21:48:28
3

คำตอบที่ดีที่สุด

4

บางอย่างเหมือนว่า:

ทศนิยม:
(?:0|[1-9](?:_*[0-9])*)[lL]?

ค่าฐานสิบหก:
0x[a-fA-F0-9](?:_*[a-fA-F0-9])*[lL]?

octal:
0[0-7](?:_*[0-7])*[lL]?

ไบนารี(ภาษาเครื่อง):
0[bB][01](?:_*[01])*[lL]?

ทุกคน:(ใน freespacing โหมด)

(?:
    0
    (?:
        x [a-fA-F0-9] (?: _* [a-fA-F0-9] )*
      |
        [0-7] (?: _* [0-7] )*
      |
        [bB] [01] (?: _* [01] )*
    )?
  |
    [1-9] (?: _* [0-9] )*
)
[lL]?

ทดสอบมัน

2021-11-23 22:47:19

อ้อ,ใช่,นั่นทำให้ฉันมีอดีตที่ยาวนาน มันออนุญาตให้มีหลาย underscores ล่ะ? บางทีนั่นอาจจะ ? ควรจะเป็น *?
Maarten Bodewes

@MaartenBodewes:อย่างที่ฉันเข้าใจหมอ underscores ไม่ควรจะเป็น contigous แต่บางทีฉันอาจจะณผิดหรอ? (พูดง่ายๆก็คือ 1____1 ได้รับอนุญาตเหรอ?). โปรดสังเกตว่ากลุ่มภายในซึ่งตัวเลือก underscore ก็คือในที่สุดใหม่
Casimir et Hippolyte

หือ,มีใครเขียนใหม่มัน regex? ฉันดูเหมือนจะเป็นสามารถที่จะปรับปรุงมัน(การทดสอบรุ่นของยังคงมีคน? แทนที่จะเป็น*)....
Maarten Bodewes

ขอบคุณอีกครั้ง,ฉันได้ส่ง คำตอบ นั่น parses จำนวนเต็มเช่นกันโดยใช้เงื่อนไขการค้นหารูปแบบการสั่งงานมาจากอยู่ในจิตวิญญาณของคุณ regex.
Maarten Bodewes
0

หลังจากคำตอบจาก Casimir ฉันตัดสินใจที่จะเอามันนิดหน่อต่อและกติดตั้งเพื่อใช้งานการหัสอันที่จริการวิเคราะห์ที่ integers เช่นกันรวมทางด้านล่างนี้ มันรวมถึงลบและอีกอย่างสัญลักษณ์แม้ว่าพวกนั้นเป็นอย่างเป็นทางการไม่ใช่ส่วนหนึ่งของจำนวนเต็มจริงที่ถูกระบุไว้ใน JLS;พวกเขาเป็น unary operators.

package nl.owlstead.ifprops;

import java.math.BigInteger;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class JavaIntegerParser {
    private static final Pattern BINARY = Pattern.compile("(0b)([01](?:_*[01])*)(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern OCTAL = Pattern.compile("(0)([0-7](?:_*[0-7])*)(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern DECIMAL = Pattern.compile("()(0|(?:[1-9](?:_*[0-9])*))(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern HEXADECIMAL = Pattern.compile("(0x)([0-9a-f](?:_*[0-9a-f])*)(L?)", Pattern.CASE_INSENSITIVE);
   
    // NOTE: OCTAL should be before DECIMAL if this is used to find the pattern
    private static final Pattern SIGNED_INTEGER_LITERAL = Pattern.compile(
            "(?:([+-])\\s*)?(" + 
            BINARY + "|" + OCTAL + "|" + DECIMAL + "|" + HEXADECIMAL + 
            ")", Pattern.CASE_INSENSITIVE);
        
    public static int parseJavaInteger(String javaInteger) throws NumberFormatException {
        BigInteger value = parseIntegerAsBigInt(javaInteger);
        try {
            return value.intValueExact();
        } catch (@SuppressWarnings("unused") ArithmeticException e) {
            throw new NumberFormatException("Number is not between Integer.MIN_VALUE and Integer.MAX_VALUE");
        }
    }
    
    public static long parseJavaLong(String javaLong) throws NumberFormatException {
        BigInteger value = parseIntegerAsBigInt(javaLong);
        try {
            return value.longValueExact();
        } catch (@SuppressWarnings("unused") ArithmeticException e) {
            throw new NumberFormatException("Number is not between Integer.MIN_VALUE and Integer.MAX_VALUE");
        }
    }

    private static BigInteger parseIntegerAsBigInt(String javaLiteral) {
        Matcher intMatcher = SIGNED_INTEGER_LITERAL.matcher(javaLiteral);
        if (!intMatcher.matches()) {
            throw new NumberFormatException(javaLiteral + " is not recognized as a Java integer literal");
        }
        
        String signGroup = intMatcher.group(1);
        String prefixAndValueGroup = intMatcher.group(2);
        String radixGroup = "";
        String valueGroup = "";
        // String longGroup = "";
        List<Pattern> patterns = List.of(BINARY, OCTAL, DECIMAL, HEXADECIMAL);
        for (Pattern pattern : patterns) {
            Matcher specificMatcher = pattern.matcher(prefixAndValueGroup);
            if (specificMatcher.matches()) {
                radixGroup = specificMatcher.group(1);
                valueGroup = specificMatcher.group(2);
                // longGroup = specificMatcher.group(3);
                break;
            }
        }
        
        if (valueGroup == null) {
            throw new RuntimeException("Number both matches but doesn't contain a value (parser error)");
        }

        BigInteger sign = signGroup != null && signGroup.matches("-") ? BigInteger.ONE.negate() : BigInteger.ONE; 
        
        int radix;
        switch (radixGroup.toLowerCase()) {
        case "0b":
            radix = 2;
            break;
        case "0":
            radix = 8;
            break;
        case "":
            radix = 10;
            break;
        case "0x":
            radix = 16;
            break;
        default:
            throw new RuntimeException();
        }
 
        BigInteger value = new BigInteger(valueGroup.replaceAll("_", ""), radix).multiply(sign);
        return value;
    }
}

ฉันยังพยายามจะใช้รหัสหายหลาย integers อกจากเป็นข้อความแต่นั่นไม่ดีเลย-นายเห็นแม่สาวน้อย ปัญหาก็คือบางอย่างนั้นไม่ถูกต้อง literals อย่างเช่น 0__0 ได้ใบตอบรับเป็นสองคน literals ด้วยค่าศูนย์;ไม่ใช่สิ่งที่เธอต้องการเป๊ะเลยสิ ดังนั้นโปรดใช้ regex เพียงเพื่อระบุสิ่งที่ผิดปกติถ้าเป็นข้อความจริงเป็นจำนวนเต็มแล้วแยกกันที่ integers e.g. ใช้ String.split(SEPARATOR_REGEX).

ขำพอแล้วของสุริยคราสแบบ ide ทำองยอมรับ 0__0 เป็นการยึดตามตัวอักษรแบบนั้แม้ว่ามันจะเป็นอย่างเป็นทางการไม่ใช่ compliant ที่ JLS. ไม่ใช่ biggy แต่ไม่ใช่เรื่องแปลกคนน้อยลง

2021-11-23 22:27:00

เร็วเข้ามุมมองของคุณตอบคำขอโทษเหนื่อยเกินไปมากกว่าลึกแต่จับต้องไม่ใช้มากเกินไปจับภาพโดยเฉพาะอย่างยิ่งถ้าไม่ต้องการพวกมัน ใช้ไม่มีการจับกลุ่ม (?:....) (จับภาพมีค่าใช้จ่าย).
Casimir et Hippolyte

ฉันใช้ไม่มีการจับกลุ่มที่เป็นไปได้ บางทีอาจจะพิสูจน์ความถูกต้องของทั้งหมดจำนวนเต็มฉันจะลบอีกไม่กี่;ฉันไม่ต้องการพวกเขาสำหรับผู้เริ่มต้นตรงกัน หรือบางทีฉันสามารถลบทั้งหมดเริ่มต้นตรงกันและปล่อยเรื่องนั้น validates ทั้งหมดเป็นรูปแบบ. แต่เฮ้,ในที่สุดเรากำลังพยายามจะตรงกับ integers ไม่ใช่หน้าและหน้าที่ของข้อความ...
Maarten Bodewes
-1

เอ่อ.... ในงานง่ายสุดเงื่อนไขของท่านฐาน 2,8,และ 10 เบอร์ อาจจะ ใช้รูปแบบเดียวกันตั้งแต่เมื่อค่าต่างๆทั้งหม numeric ตัวอักษร แต่คุณอาจจะต้องการการแสดงออกสำหรับแต่ละประเภทนี้ได้นะ ปัญหาก็คือการที่คุณยังไม่ได้ทำให้ชัดเจนความตั้งใจของคุณ ฉันขึ้นสมมติฐานที่ว่าคุณต้องการแสดงเพื่อพิสูจน์ความถูกต้องของฐานอะไรเป็นพิเศษคืนค่า.

String base10Regex = "[0-9]+";
String base2Regex = "[0-1]+";
String base8Regex = "[0-7]+";
String base16Regex = "^[0-9A-F]+$";

สำหรับ octal และทศนิยมค่าของคุณจะต้องการจะเพิ่ของคุณแสดงให้ตรวจสอบเป็นตัวเลือกตัวละครเซ็น "^[\\+|-]?". สำหรับเลขฐานสิบหกค่าถ้าคุณคาดหวังค่าจะเริ่มต้นด้วย"0x"ฉันจะแนะนำว่าจะเพิ่งแสดงกับพวกนั้นยึดตามตัวอักษรแบบนั้นค่า.

2021-12-09 23:34:58

ไม่ underscores แล้วมันก็ไม่ตรงกับที่แท้จริง integers. และแน่นอนที่ขอบเขต(^$)จะไม่ทำงานกับเจนแต่มันคือการเริ่มต้น...
Maarten Bodewes

@MaartenBodewes ขอบคุณ ฉันยินยอมให้คุณ underscores แต่คุณหมายความว่าอะไรมันไม่ตรงกับที่แท้จริง integers? ก็ฉันไม่รู้ขอบเขตไม่ได้ทำงานกับ find. ดังนั้น,ขอบคุณสำหรับสิ่งเหล่านั้นเช่นกัน
hfontanez

ขอโทษของฉันเลวร้ายฉันหมายถึงนั่นมันไม่ตรงกับ literals ที่ชี้ให้เห็นว่าใน JLS อยู่ที่ไหนคุณต้องมี 0x หรือ 0X สำหรับเลขฐานสิบหกเป็นต้น
Maarten Bodewes

@MaartenBodewes ยกเว้นผมเขียนหนังสือเรื่อง"ถ้าคุณคาดหวังค่าจะเริ่มต้นด้วย"0x"ฉันจะแนะนำว่าจะเพิ่งแสดงกับพวกนั้นยึดตามตัวอักษรแบบนั้นค่า"
hfontanez

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่